从C程序执行Perl脚本

时间:2011-03-07 23:59:37

标签: c perl

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

我看到它的方式有几个不同的选择:

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

    谢谢!

2 个答案:

答案 0 :(得分:3)

解决方案:

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

上述每种方法都有优点和缺点。这取决于你关注的是什么:

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

最后,如果是我,我会选择嵌入或翻译,具体取决于它是否会再次更改。

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

答案 1 :(得分:0)

如果perl脚本不是很长,可能你应该用C重写它并忘记perl。

否则,我会使用系统调用。如果需要考虑可移植性,可以使用perlcc编译perl脚本,以获得一个完全可移植的exe文件,并且可以避免在每台要运行该程序的机器上安装perl。