2012-12-18 37 views
0

在Perl中我想達到以下翻譯:Perl的模式匹配和附加

stmt1; gosub xyz; 

stmt1; xyz(); 

我怎樣才能做到這一點?從你要編輯的文件(保換file.ext)命令行

+0

請參閱http://www.comp.leeds.ac.uk/Perl/sandtr.html – Himanshu

+0

我嘗試使用「;」分隔線,作爲dilimiter,然後如果發現模式,我試圖更換它。 $ line =〜m/$ pattern_gosub(。*?)(\;)* $ /; $ line =〜s/$ pattern_gosub //; $ line =〜s/$ 1/$ 1 \(\)\; /; 但是這並沒有工作 – user1912265

回答

1

已經給提供了近似答案的答案,這將涉及您的邊緣情況(缺少分號,分號後的附加分句)。

perl -plwe 's/\bgosub\s+([^;]+)/$1()/g' 

它將所述gosub關鍵字隨後空白是「不分號」並刪除它們後匹配任何字符序列。我還添加了/g全局修飾符,因爲您可能希望在一行中完成所有替換。請注意使用字邊界\b來防止部分匹配,例如不能代替legosub

如果字邊界不夠,例如它將取代1.gosub因爲.導致單詞字符之間的休息,你可以使用一個負回顧後改爲:

perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g' 

這就要求gosub之前的任何字符不是除了分號或空格什麼。請注意,雙重否定也允許不匹配(行首)。

+0

非常感謝。它適用於我遇到的所有條件 – user1912265

+0

@ user1912265不客氣。您知道,如果您覺得已解決問題,您可以點擊旁邊的複選標記將答案標記爲「已接受」。 – TLP

0
my $str = 'stmt1; gosub xyz;'; 
$str =~ s/gosub (.*?);?/$1();/; 

print $str; 
+0

謝謝你的工作。分號缺失的行數很少,在這種情況下我需要做些什麼改變? – user1912265

+0

我加了;?正則表達式,它應該幫助 –

1

運行:

perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext 
+0

感謝您的幫助。 分號缺失的行數很少,在這種情況下我必須做些什麼改變? – user1912265

+0

那麼你需要的東西將被視爲你的函數名稱的結尾。如果它只是一個換行符,那麼你可以使用它:'perl -i.bk -pe's/gosub(。*?)\ n/$ 1()\ n/g'file.ext' – Ilion

+0

這是可能的,是gosub之後的另一個聲明。對不起,最初沒有指定。所以這條線可以是stmt1; gosub foo; stmt2;或者它也可以只是stmt1; gosub foo – user1912265