下面的 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: $_";
}
先对ARGV执行grep操作。
@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;
while (<>)
{
# do something with the other files
}
保罗·鲁布的答案可供参考,更多信息请参见perlop手册中的IO运算符部分。其中提到了使用grep的模式,以及与<>相关的其他一些内容。
请注意提到了ARGV::readonly,涉及诸如:
perl dangerous.pl 'rm -rfv *|'
perl -E'@ARGV=<"*">; while(<>){if (/searchedWord/){say $ARGV; close ARGV;}}'
- MacMartin