10

下面的 Perl 代码有一个明显的低效率;

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

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

在运行此特定脚本的文件大小上,这不太可能产生明显的差异,但为了学习;我怎样才能将整个文件 <> 工作并移至下一个文件?

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

4

3 回答 3

20

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

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

while (<>) {
    if (/# Skip the rest of this file/) {
        close ARGV;
        next;
    }
    print "$ARGV: $_";
}
于 2009-09-14T16:15:30.493 回答
15

先 grep ARGV。

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

while (<>)
{
  # do something with the other files
}
于 2009-09-14T15:57:25.513 回答
9

Paul Roub 的答案适用于更多信息,请参阅perlop 手册页的 IO 运算符部分。提到了使用 grep 的模式以及与 <> 相关的一些其他内容。

请注意ARGV::readonly关于以下内容的提及:

perl dangerous.pl 'rm -rfv *|'
于 2009-09-14T16:10:13.153 回答