对于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
答案 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>) {....
然后可以对每个文件进行计数,因为循环知道它在哪个文件中。