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

Mag*_*nus 4 linux perl

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

换句话说,当我写:

perl -ne '$count++ if/.../; END {print "$ARGV: $count" if $count > 0}' mysourcedir/*.html
Run Code Online (Sandbox Code Playgroud)

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

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

echo mysourcedir/*.html | xargs -n1 perl -ne '$count++ if/.../; END {print "$ARGV: $count" if $count > 0}'
Run Code Online (Sandbox Code Playgroud)

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


答:基于@ mpapec的技术,加上一个小调整也可以重置每个文件的$ count var,我得到这个有效:

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

Сух*_*й27 9

你可以检查eof每个文件的结尾,

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

要么

perl -ne '$count++ if/.../; eof && do{ print "$ARGV: $count" if $count > 0 }' mysourcedir/*.html
Run Code Online (Sandbox Code Playgroud)