linux - Perl one-liner 是否可以为给定的每个文件 arg 执行 END block

标签 linux perl

对于 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/

相关文章:

linux - 如何在Linux中的文本文件中获取最新快照的详细信息?

.net - 如何在 Ubuntu 16.04 LTS 上安装 dotnet SDK

java - 尝试通过 Inline::Java 模块将 Java 内联到 Perl

perl 结合 map 和每个

linux - 使用“查找”命令剪切日期以选择日期

linux - 将 PDF 与 PDFTK 与书签合并?

linux - Qt 低功耗蓝牙多连接

regex - 了解这个 Perl 解决方案

使用 utf8 时不输出 Perl 警告、严格错误和诊断错误

database - Class::DBI 的 future 是什么?