【问题标题】:Execute Perl script from C program从 C 程序执行 Perl 脚本
【发布时间】:2011-07-10 18:06:25
【问题描述】:

我目前有一个我用 C 编写的程序,我有兴趣将一个相当冗长的 Perl 脚本集成到其中,该脚本是其他人编写的,它完成类似的功能,但以不同的方式完成。我对手动将整个 Perl 脚本翻译成 C 语言不感兴趣。

在我看来,有几种不同的选择:

  1. 因为脚本使用标准输入和标准输出进行通信,所以我知道我可以使用系统调用,例如system("perl script.pl") 和管道输入和输出,但我觉得这个解决方案不便携,感觉不是很优雅。
  2. 我可以将 Perl 解释器嵌入到我的程序中以处理脚本,但是,我觉得这可能会很笨重,并且对于执行不会更改的脚本来说可能会过大。这确实提供了一个优势,即我可以直接调用 Perl 子例程,而不是管道输入和输出。
  3. 我可以使用某种 perl-to-c 翻译工具(如perlcc)在编译时将 Perl 源代码编译为 C 源代码,然后将其包含到我的程序的其余部分中。尽管乍一看我认为这将是最好的选择,但在 Perl 社区(或者至少是谷歌向我展示的其中一部分)似乎有一个广泛的共识,即进行这种翻译不是一个好主意(这个可能只是出于速度考虑,这对我来说根本不是问题)。这也(可能?)允许我从 C 代码中调用 Perl 子例程,这将是一个巨大的优势。
  4. 手动重写脚本。

所以我的问题是:这些选项中的哪一个(或以上都不是)最优雅和便携?我知道从 C 程序中调用这个 Perl 程序已经是一个混乱的 hack,但最不混乱的解决方案可能是最好的。

谢谢!

【问题讨论】:

  • 把perl编译成C,相信perl可以帮你搞定。
  • 我对此进行了调查,并且我很确定它曾经(通过 B::C 和 B::CC 模块),但由于它们存在错误和过时而放弃了支持。
  • 可以。我相信其中一个模块只是嵌入了 Perl 解释器,然后编写了 Perl 代码对应的 C 代码。真正将 Perl 有意义地翻译成 C 的那个是非常不可靠的。

标签: c perl


【解决方案1】:

解决方案:

  • 是 hacky 但肯定是可行的。您可能不想使用 system() 本身,因为您可能希望从 pipe() 调用中读取和写入输出。 IE,你需要创建必要的套接字,fork 然后在子进程中执行 perl 脚本并读取父进程的输出。虽然这可能是更少的代码,但它并不一定比以下更容易:
  • 嵌入 perl:需要一些时间来设置,但一旦设置好,它实际上真的很流畅。我为Net-SNMP 编写了一个完整的嵌入式perl 系统,效果非常好。一旦你设置好它,你会发现它启动和运行所需的努力是多么的少。话虽如此,这是相当可怕的代码。
  • perl-to-c 在理论上可能很好,但我不希望它一直工作。如果你只需要这样做一次,它可能值得一试。但是您需要一个好的测试套件来确保输出符合您的预期。
  • 手动重写脚本:老实说,这肯定是“最干净”的解决方案。如果脚本在未来不会改变,这很可能是要走的路,除非它是一项艰巨的任务,因为它实际上有那么大(你不会说)。

上述每种方法都有优点和缺点。这取决于您关心的问题:

  • 经常这样做(即 perl 会不断变化):使用嵌入式 perl
  • 最少的时间:那么这取决于脚本有多大。根据脚本的外观,1、2、3 或 4 可能是最快的。如果它很长,则跳过#4。如果它真的很短,那么直接进入第 4 位。

最后,如果是我,我会根据是否要再次更改来选择嵌入或翻译。

现在...我为geocaching 编写了一个完整的系统,我实际上想将其翻译成Qt,因为我认为它会更便携。我的正确选择是什么?翻译。但这需要很长时间,因此我还没有这样做。

【讨论】:

  • 感谢您的帮助。虽然脚本比较长,但我想我会手动翻译一下。
【解决方案2】:

如果 perl 脚本不是很长,也许你应该用 C 重写它而忘记 perl。

否则,我会使用系统调用。如果担心可移植性,您可以使用 perlcc 编译 perl 脚本,以获得完全可移植的 exe 文件,这样您就无需在要运行该程序的每台机器上安装 perl。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多