如何在perl脚本中加入'perl -pne'功能

时间:2010-06-21 08:49:03

标签: 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脚本?

2 个答案:

答案 0 :(得分:10)

-e接受任意复杂的程序。所以加入你的替换操作吧。

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

如果你真的想要一个处理输入和循环显式的Perl程序,请解析单行程序以查看生成的代码并从此处开始工作。

> 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 :(得分:6)

您没有完全提出的问题的相关答案:与$^I一起使用的perl special variable @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 $_;
}