以下Perl代码具有明显的低效率;
while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}
代码将遍历我们不想要的文件的每一行。
关于这个特定脚本运行的文件的大小,这不太可能产生明显的差异,但是为了学习;我怎么能破坏整个文件&lt;&gt;正在努力并转移到下一个?
这样做的目的是因为此脚本运行的服务器存储了旧版本的应用程序,文件名中包含版本号,我只对当前版本感兴趣。
答案 0 :(得分:20)
如果您可以在开始阅读任何文件之前过滤@ARGV
,那么Paul Roub的解决方案是最好的。
如果您在开始迭代后必须跳过文件,
while (<>) {
if (/# Skip the rest of this file/) {
close ARGV;
next;
}
print "$ARGV: $_";
}
答案 1 :(得分:15)
首先是grep ARGV。
@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;
while (<>)
{
# do something with the other files
}
答案 2 :(得分:9)
Paul Roub的answer可以获取更多信息,请参阅The IO operators section of perlop man page。提到了使用grep的模式以及与&lt;&gt;。
相关的一些其他事项请注意提及ARGV::readonly之类的内容:
perl dangerous.pl 'rm -rfv *|'