对于 Perl 单行代码,当使用 -p
或 -n
标志时是否可以使 END {}
block 执行每个文件一次,而不是整个程序一次?
换句话说,当我写:
perl -ne '$count++ if/.../; END {print "$ARGV: $count" if $count > 0}' mysourcedir/*.html
我想为每个文件执行一次 END block ,而不是在程序执行结束时全局执行一次。
目前我只是为此使用 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 变量,我得到了这个有效的方法:
perl -ne '$count++ if/.../; if (eof && $count > 0) {print "$ARGV: $count"; $count = 0;} ' mysourcedir/*.html
最佳答案
你可以检查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
关于linux - Perl one-liner 是否可以为给定的每个文件 arg 执行 END block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20198881/