Perl one-liner可以为每个文件arg执行END块执行

时间:2013-11-25 17:02:46

标签: linux perl

对于Perl单行,当使用-p-n标志时,是否可以使END {}块每个文件执行一次,而不是只对整个程序执行一次?

换句话说,当我写:

perl -ne '$count++ if/.../; END {print "$ARGV: $count" if $count > 0}' mysourcedir/*.html

我想为每个文件执行一次END块,而不是在程序执行结束时全局执行一次。

目前我只是使用xargs,但想知道Perl是否可能有一些替代标志用于该行为。

echo mysourcedir/*.html | xargs -n1 perl -ne '$count++ if/.../; END {print "$ARGV: $count" if $count > 0}'

PS - 如果你想知道为什么我不只是grep | wc -l这个简单的情况,那是因为这个例子从我的实际用例中简化了,它同时涉及incr(++)作为计数器中的decr( - )


答案:根据@ mpapec的技术,加上一个小调整来重置每个文件的$ count var,我得到了这个有效:

perl -ne '$count++ if/.../; if (eof && $count > 0) {print "$ARGV: $count"; $count = 0;} ' mysourcedir/*.html

2 个答案:

答案 0 :(得分:9)

您可以查看eof查看每个文件的结尾,

perl -ne '$count++ if/.../; eof && sub{ print "$ARGV: $count" if $count > 0 }->()' mysourcedir/*.html

perl -ne '$count++ if/.../; eof && do{ print "$ARGV: $count" if $count > 0 }' mysourcedir/*.html

答案 1 :(得分:0)

不幸的是它不能像这样工作(但请参阅mpapec的答案以获得优雅的选择)。

如果我需要做这种事情,我只用-e调用Perl(没有-n标志),然后做类似的事情:

for my $filename (@ARGV) { open(my $file,"<$filename")||die$!; while(<$file>) {....

然后可以对每个文件进行计数,因为循环知道它在哪个文件中。