拥有多个-e
值是有效的,但它有用吗?多个值-e
仅组合到一个程序中,由您来确保它们一起构成一个语法正确的程序。该B::Deparse
程序可以向您展示perl
该程序的想法:
$ perl -MO=Deparse -e 'print' -e 'q(Hello' -e ')'
print "Hello\n";
-e syntax OK
需要注意的一件奇怪的事情是换行符偷偷溜进去了。想想它是如何到达那里的,看看还有什么其他perl
方法可以组合多个-e
值。
在您的程序中,您正在替换当前行,然后取修改后的行并再次替换。最好写成:
prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g; s/(\W)##/\1/g'
现在,如果您通过一些自动化过程添加越来越多的内容来构建此命令行,-e
并且您不提前知道会得到什么,那么这些可能是-e
有道理的。但是,您可能会认为您可以执行相同的操作来构建您提供给的字符串-e
。我不知道什么会更好,因为您没有解释为什么要这样做。
但是,我怀疑在某些情况下,人们实际上是在考虑只进行一项替代工作。他们想尝试一种,如果它的模式不起作用,尝试另一种,直到成功。在这种情况下,您不想用分号分隔替换。改为使用短路||
。s///
返回它所做的替换次数,并在||
找到真值时停止(短路):
prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g || s/(\W)##/\1/g'
请注意,您只需要一个-p
. 它只做一次它的工作。这是具有多个-p
deparsed 的程序:
$ perl -MO=Deparse -i -pe 's/##(\W)/\1/g;' -pe 's/(\W)##/\1/g;'
BEGIN { $^I = ""; }
LINE: while (defined($_ = readline ARGV)) {
s/##(\W)/$1/g;
s/(\W)##/$1/g;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK
这与只有一个相同-p
:
$ perl -MO=Deparse -pi -e 's/##(\W)/\1/g;' -e 's/(\W)##/\1/g;'
BEGIN { $^I = ""; }
LINE: while (defined($_ = readline ARGV)) {
s/##(\W)/$1/g;
s/(\W)##/$1/g;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK