2010-04-08 373 views
8

我想知道是否有任何提示或技巧將Perl轉換爲python。如果有像python的2to3這樣的腳本,那將會很好。或者可能有一些兼容性庫。它不一定是完整的,任何有助於加速該過程的東西都會有所幫助。將Perl移植到Python

+0

看過這麼多次,雖然你的問題似乎比許多這些類型的問題更合理。 – 2010-04-08 02:47:26

+6

沒有任何提示,但自動轉換腳本會需要Perl可以解析... http://www.jeffreykegler.com/Home/perl-and-undecidability :-) – ig0774 2010-04-08 02:49:34

+2

當然,人們實際上寫的Perl是非常可靠的,並且有很多Perl解析工具可用。不錯,儘管。 – jrockway 2010-04-09 01:47:38

回答

17

保留一個phrasebook方便您瀏覽您想要移植的代碼。

+5

謝謝你實際回答我的問題,而不是告訴我爲什麼我不應該/不能這樣做。 – rook 2010-04-09 03:11:24

5

將Perl轉換爲Python的最佳「工具」仍然是你自己:)。從Python docs瞭解Python的語法以及它的工作原理。然後手動進行轉換。例如,Perl使用正則表達式很多,但是,在Python中,字符串操作非常簡單,大多數情況下,regex是不需要的。轉換器如何預先知道?在Perl中有很多方法可以做,所以轉換器如何知道什麼是最好的與Python等價的?因此,手動轉換仍然是去

最好的方式,如果你有興趣,你可以看看這個book 同樣感興趣,Pleac

+8

「Perl使用正則表達式很多,但是,在Python中,字符串操作非常容易,大多數時候,regex是不需要的」?真的嗎? – AmbroseChapel 2010-04-08 05:29:43

+3

爲什麼python中的字符串操作看起來很容易,唯一的原因是因爲更復雜的字符串操作比較困難,所以人們通常不會。 – Michael 2010-04-08 05:36:51

+0

@Ambrose,除非您有豐富的Python和Perl知識,否則我無法真正回答您,並且可以看到自己的差異。 – ghostdog74 2010-04-08 05:43:17

6

有在Perl做同樣的事情這麼多的方法編寫任何類型的交叉編譯器都會......痛苦至極。重建(不要只是翻譯)手動程序。

2

轉換需要編寫一個Perl解析器,語義檢查器和Python代碼生成器。

不實用。 Perl解析器對於Perl團隊來說是很難做到的。你最好使用Perl操作碼或相關模塊將Perl從Perl AST(操作碼)翻譯成Python。

http://perldoc.perl.org/Opcode.html

一些標註不從Perl的映射到Python沒有一些工作。例如,Perl的關閉是不同的。它的正則表達式支持也是如此。

簡而言之,可以手動轉換它,也可以使用一些集成模塊從Perl調用Python,反之亦然。

3

另一種方法是,您可能可以重新使用現有的Perl代碼並用新的Python代碼對其進行補充。

可能適用於您的一種可能性是使用perl Python module,它允許您在Py​​thon內執行Perl代碼

另一種方法是讓Perl將輸出作爲簡單的文本/ JSON/YAML文件輸出,並由Python進行解析以供進一步處理。因此,我可以在不改寫它的情況下使用舊版Perl代碼,同時切換到Python。您的里程可能會有所不同,因爲這種「膠合」方法可能對您的需求太慢。當你有很長的計算產生中間結果時,這個「傳遞文件」方法是很好的:你可以用Perl開始計算,然後用Python繼續。

5

不幸的是我跑進了同一個泡菜,似乎沒有直接的辦法。但是如果你像我一樣熟悉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/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 

+0

Add 1,$ s/{/:/ g 1,$ s /} // g 這可能會給轉換大小寫和循環代碼塊的邊緣:) – 2015-07-06 18:22:39