从C程序执行Perl脚本

Wir*_*uce 5 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. 手动重写脚本.

所以我的问题是:这些选项中的哪一个(或者上面没有一个)是最优雅和最便携的?我知道从一个C程序中调用这个perl程序已经是一个混乱的黑客入手,但最不凌乱的解决方案可能是最好的.

谢谢!

Wes*_*ker 3

解决方案:

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

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

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

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

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