2010-06-21 18 views
1

因此,在命令行中,我可以方便地做這樣的事情:如何把「perl的-pne」功能在Perl腳本

perl -pne 's/from/to/' in > out 

如果我需要重複這個和/或我有幾個其他perl -pne轉換,我可以將它們放入Windows中的.bat文件中。當然,這是一個相當迂迴的做法。我應該只寫一個perl腳本,其中包含所有這些正則表達式轉換。

那你怎麼寫呢?如果我有一個包含這些行的shell腳本:

perl -pne 's/from1/to1/' in > temp 
perl -pne 's/from2/to2/' -i temp 
perl -pne 's/from3/to3/' -i temp 
perl -pne 's/from4/to4/' -i temp 
perl -pne 's/from5/to5/' temp > out 

如何我只是把這些都變成一個perl腳本?

+0

我認爲'-i'標誌會用輸出覆蓋輸入文件,但我不確定。至少這是我的意圖。 – polygenelubricants 2010-06-21 08:52:33

+3

小記:-p覆蓋-n,所以你不需要兩個。這並不多,但我認爲一個命令的論點越少越好。是的,-i編輯了一個文件,請參閱perlrun。 – musiKk 2010-06-21 09:16:08

回答

10

-e接受任意複雜的程序。所以只需加入您的替代操作。

perl -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/' in > out 

如果你真的想要一個處理輸入和明確地循環Perl程序,deparse一行程序來查看生成的代碼和工作在這裏。

> perl -MO=Deparse -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/' 
LINE: while (defined($_ = <ARGV>)) { 
    s/from1/to1/; 
    s/from2/to2/; 
    s/from3/to3/; 
    s/from4/to4/; 
    s/from5/to5/; 
} 
continue { 
    print $_; 
} 
-e syntax OK 
+1

哇,我想我開始愛上perl ... – polygenelubricants 2010-06-21 09:29:57

+0

真棒的想法。我做了很多Perl,而且我經常會得到一個單一的內容,這個內容會增長到需要轉換爲真實腳本的程度。我無法相信我從來沒有想過要用Deparse作爲緩解一些更長距離單線的捷徑。 – 2011-04-23 20:55:43

6

相關答案你沒有相當提出這樣的問題:在perl special variable$^I,與@ARGV一起使用,給人的-i就地編輯行爲。與-p選項一樣,Deparse將顯示生成的代碼:

perl -MO=Deparse -pi.bak -le 's/foo/bar/' 
BEGIN { $^I = ".bak"; } 
BEGIN { $/ = "\n"; $\ = "\n"; } 
LINE: while (defined($_ = <ARGV>)) { 
    chomp $_; 
    s/foo/bar/; 
} 
continue { 
    print $_; 
}