2010-06-21 22 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 $_; 
}