我可以使用<>运算符跳过整个文件吗?

Chr*_*ver 10 perl diamond-operator argv

以下Perl代码具有明显的低效率;

while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}
Run Code Online (Sandbox Code Playgroud)

代码将遍历我们不想要的文件的每一行.

关于这个特定脚本运行的文件的大小,这不太可能产生明显的差异,但是为了学习; 我怎么能破坏整个文件<>正在工作并转移到下一个?

这样做的目的是因为此脚本运行的服务器存储旧版本的应用程序,文件名中包含版本号,我只对当前版本感兴趣.

eph*_*ent 20

如果您可以@ARGV在开始阅读任何文件之前进行过滤,那么Paul Roub的解决方案是最好的.

如果在开始迭代后必须跳过文件,

while (<>) {
    if (/# Skip the rest of this file/) {
        close ARGV;
        next;
    }
    print "$ARGV: $_";
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*oub 15

首先是grep ARGV.

@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;

while (<>)
{
  # do something with the other files
}
Run Code Online (Sandbox Code Playgroud)


mik*_*grb 9

Paul Roub的答案可以获得更多信息,请参阅perlop手册页的IO运算符部分.提到了使用grep的模式以及与<>相关的一些其他事项.

请注意提及ARGV :: readonly,例如:

perl dangerous.pl 'rm -rfv *|'
Run Code Online (Sandbox Code Playgroud)