将Perl移植到Python

将Perl移植到Python,python,perl,Python,Perl,我想知道是否有什么技巧可以将perl转换成python。如果有像python这样的脚本就好了。或者是一些兼容性库。它不必是完整的,任何有助于加快进程的东西都会很有帮助。将Perl转换为Python的最佳“工具”仍然是您自己:)。从中学习Python的语法及其工作原理。然后手动进行转换。例如,Perl大量使用正则表达式,然而,在Python中,字符串操作非常简单,大多数情况下不需要正则表达式。转换器如何事先知道这一点??在Perl中也有很多方法,那么转换器如何知道什么是Python等价物的最佳选择

我想知道是否有什么技巧可以将perl转换成python。如果有像python这样的脚本就好了。或者是一些兼容性库。它不必是完整的,任何有助于加快进程的东西都会很有帮助。

将Perl转换为Python的最佳“工具”仍然是您自己:)。从中学习Python的语法及其工作原理。然后手动进行转换。例如,Perl大量使用正则表达式,然而,在Python中,字符串操作非常简单,大多数情况下不需要正则表达式。转换器如何事先知道这一点??在Perl中也有很多方法,那么转换器如何知道什么是Python等价物的最佳选择呢?因此,手动转换仍然是最好的方式

如果你感兴趣,你可以看看这个
同样有趣的是,

在Perl中有很多方法可以做同样的事情,因此编写任何类型的交叉编译器都是。。。充其量是痛苦的。手动重建(而不仅仅是翻译)程序。

转换需要编写Perl解析器、语义检查器和Python代码生成器

不实际。Perl解析器对于Perl团队来说已经足够难了。最好使用Perl操作码或相关模块将Perl从Perl-AST(操作码)翻译成Python

有些符号不需要做一些工作就无法从Perl映射到Python。例如,Perl的闭包是不同的。它对正则表达式的支持也是如此


简而言之,可以手动转换,也可以使用一些集成模块从Perl调用Python,反之亦然。

在浏览要移植的代码时,请随时准备。

另一种方法是,您可以重用现有的Perl代码,并用新的Python代码对其进行补充

一种可能对您有效的方法是使用,它允许您在Python中执行Perl代码


另一种方法是让Perl以简单的text/JSON/YAML文件的形式生成其输出,并由Python进行解析以进行进一步处理。因此,在切换到Python时,我能够使用遗留的Perl代码而无需重写它。您的里程数可能会有所不同,因为这种“粘合”方法对于您的需要可能太慢。当您进行长时间的计算并产生中间结果时,这种“传递文件”方法是很好的:您可以用Perl启动计算,然后用Python继续。

不幸的是,我遇到了同样的问题,似乎没有直接的方法。但是如果你像我一样精通vim,你可以很快列出这样的清单

只需在一个名为(或其他名称)“substitute”的文件中键入所有这些内容,然后打开Perl脚本(首先备份原始脚本),然后执行:source path/to/the/substitute。请注意,这绝非完美,但可能会给你一个良好的开始方向(希望如此!)

1,$s/\$\(.*\)/\1/g 1,$s/\$\(.*\)->/\1\./g 1,$s/->/\./g 1$s/\$//g 1$s/eq/\=\=/g 1$s///g 1,$s/=>/:/g 1$s/使用/导入/g 1$s/:/\/g 1$s/| |或/g 1、$s/&/和/g 1$s/my//g 1美元s/sub/def/g 1$s/undef/None/g 1$s/%//g 1$s/$//G 1$s/\/os.environ/g 1$s/g
您已经多次看到这一点,尽管您的问题似乎比这些类型的问题更合理。没有提示,但是自动转换脚本需要Perl是可解析的…:-)当然,人们实际编写的Perl是非常可确定的,并且有很多Perl解析工具可用。很好的尝试。“Perl大量使用正则表达式,然而,在Python中,字符串操作非常简单,大多数时候不需要正则表达式”?说真的?python中的字符串操作看起来很容易的唯一原因是,更复杂的字符串操作更难进行,所以人们通常不这么做。我对python的了解还不够透彻,无法评论它与Perl、BuuuUut的区别。。。一般来说,“除非你已经知道得足够多,否则我无法解释答案”,这是一种逃避回答,带有“我真的不知道我在说什么”的味道。任何你至少不能向外行解释的话题都是你自己不完全理解的话题。看看PLEAC的东西,我们这里有一个案例,一种技术从一种语言死记硬背地翻译出来,导致另一种语言看起来很糟糕。例如,在Perl中,一个字符一个字符地工作是很少见的。为什么?首先,这是一个让人头疼的问题。一个公平的警察。另一方面,使用正则表达式通常可以更快更容易地完成。可以反转OP的语句并说“在Perl中,正则表达式非常简单,大多数时候不需要其他字符串操作”。无论如何,OP的观点是正确的。Perl程序使用的方式与Python不同,因此死记硬背的翻译器会产生令人讨厌的代码。Perl程序使用正则表达式而不是字符串操作的原因之一是它速度更快。如果您使用Unicode,它可能比直接字符串操作更正确。感谢您回答我的问题,而不是告诉我为什么我不应该/不能这样做。添加1,$s/{/:/g 1,$s/}//g这可能会为转换大小写和循环代码块提供优势:) 1,$s/\$\(.*\) /\1 /g 1,$s/\$\(.*\)->/\1\./g 1,$s/->/\./g 1,$s/\$//g 1,$s/ eq / \=\= //g 1,$s/@//g 1,$s/=>/:/g 1,$s/use /import /g 1,$s/::/\./g 1,$s/||/or/g 1,$s/&&/and/g 1,$s/my //g 1,$s/sub /def /g 1,$s/ undef/ None/g 1,$s/%//g 1,$s/;$//g 1,$s/\/os.environ/g 1,$s/defined //g