下面的 Perl 代码有一个明显的低效率;
while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}
代码将逐步遍历我们不想要的文件的每一行。
在运行此特定脚本的文件大小上,这不太可能产生明显的差异,但为了学习;我怎样才能将整个文件 <> 工作并移至下一个文件?
这样做的目的是因为这个脚本运行的服务器存储旧版本的应用程序,文件名中带有版本号,我只对当前版本感兴趣。
下面的 Perl 代码有一个明显的低效率;
while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}
代码将逐步遍历我们不想要的文件的每一行。
在运行此特定脚本的文件大小上,这不太可能产生明显的差异,但为了学习;我怎样才能将整个文件 <> 工作并移至下一个文件?
这样做的目的是因为这个脚本运行的服务器存储旧版本的应用程序,文件名中带有版本号,我只对当前版本感兴趣。
@ARGV
如果您可以在开始阅读任何文件之前进行过滤,那么 Paul Roub 的解决方案是最好的。
如果您在开始迭代后必须跳过文件,
while (<>) {
if (/# Skip the rest of this file/) {
close ARGV;
next;
}
print "$ARGV: $_";
}
先 grep ARGV。
@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;
while (<>)
{
# do something with the other files
}
Paul Roub 的答案适用于更多信息,请参阅perlop 手册页的 IO 运算符部分。提到了使用 grep 的模式以及与 <> 相关的一些其他内容。
请注意ARGV::readonly关于以下内容的提及:
perl dangerous.pl 'rm -rfv *|'