是否有将Perl转换为Python的工具?

23 投票
7 回答
36637 浏览
提问于 2025-04-15 12:35

在我新的工作中,使用Python的人比使用Perl的人多,而我自己写了一个非常有用的API,我想把它分享给我的同事们,让他们也能在Python中使用。

我觉得如果能有一个工具,把Perl代码转换成Python代码,那就太好了,这样我就可以更方便地完成这个任务。在我尝试自己写一个解析Perl代码的工具之前,我发现了一个来自咨询公司的工具,叫做bridgekeeper

不过,花钱请咨询公司来帮我翻译这个API,可能不太值得,但这个工具真的很有趣。

有没有人知道有没有这样的工具,可以解析(或者尝试解析!)Perl5代码,并把它转换成Python?如果没有这样的工具,我该如何开始写一个简单的编译器,把我的面向对象的Perl代码转换成Python?有没有什么ANTLR或者YACC的语法可以作为我的起点?

补充一下:我找到了一份perl.y,如果我想自己做一个编译器,这可能是一个不错的起点。

7 个回答

7

从5.10版本开始,你可以在编译perl的时候启用一个实验性的功能,叫做杂项属性装饰。然后你可以设置一个叫做PERL_XMLDUMP的环境变量,指定一个文件名,这样就能得到一个解析树的XML输出(包括注释,这对语言翻译者非常有帮助)。不过正如文档所说,这个功能还在不断完善中。

18

我觉得你应该重写你的代码。解析结果的质量取决于你写Perl代码的风格。我觉得下面这段话很好地总结了理论方面的内容。来自维基百科:维基百科上的Perl

Perl有一个图灵完备的语法,这意味着在编译阶段执行的运行时代码会影响解析过程。因此,Perl不能仅仅通过简单的Lex/Yacc词法分析器和解析器组合来解析。相反,Perl解释器实现了自己的词法分析器,并与一个修改过的GNU bison解析器配合使用,以解决语言中的歧义。

人们常说“只有Perl能解析Perl”,意思是只有Perl解释器(perl)能解析Perl语言(Perl),但这并不总是正确的。因为Perl解释器在编译阶段可以模拟一个图灵机,它需要解决停机问题才能在每种情况下完成解析。停机问题是一个长期以来被认为无法解决的问题,因此即使是Perl也不能总是解析Perl。Perl做了一个不寻常的选择,让用户在编译阶段可以使用其全部编程能力。这在理论上代价很高,但在实际使用中似乎很少遇到麻烦。

其他尝试解析Perl的程序,比如源代码分析器和自动缩进工具,不仅要面对模糊的语法结构,还要处理Perl解析的一般不可判定性。亚当·肯尼迪的PPI项目专注于将Perl代码作为文档进行解析(保持其作为文档的完整性),而不是将Perl解析为可执行代码(连Perl自己也不能总是做到这一点)。正是肯尼迪首次猜测,“解析Perl会受到‘停机问题’的影响。”这一点后来得到了证明。

36

詹姆斯,

我建议你直接用Python重写这个模块,原因有几个:

  1. 解析Perl代码真的很难。如果这不是你特别想做的事情,你会发现花在翻译上的时间远远超过了做有用工作的时间。
  2. 重写这个模块是个很好的机会来练习Python。学习最有效的方式就是动手做,而有一个真正需要完成的任务会让你受益匪浅。
  3. 最后,Python和Perl的设计理念差别很大。为了让你的代码更符合Python的风格,直接用Python重写是最好的选择。

撰写回答