代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver Tom-Oliver Heidel

我可以用<>操作符跳过整个文件吗?

  •  9
  • Chris Huang-Leaver Tom-Oliver Heidel  · 技术社区  · 15 年前

    下面的Perl代码有明显的低效性;

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

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

    在文件大小上,运行此特定脚本的文件不太可能有明显的区别,但为了学习,我如何将整个文件丢弃并移到下一个文件中?

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

    3 回复  |  直到 15 年前
        1
  •  15
  •   Paul Roub Mark Dail    15 年前

    首先是grep argv。

    @ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;
    
    while (<>)
    {
      # do something with the other files
    }
    
        2
  •  19
  •   ephemient    15 年前

    保罗·鲁布的解决方案是最好的,如果你能过滤 @ARGV 在开始读取任何文件之前。

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

    while (<>) {
        if (/# Skip the rest of this file/) {
            close ARGV;
            next;
        }
        print "$ARGV: $_";
    }
    
        3
  •  9
  •   Community WizardZ    7 年前

    Paul Roub answer 有关详细信息,请参见 The IO operators section of perlop man page .其中提到了使用grep的模式以及与<>相关的其他一些内容。

    注意提到 ARGV::readonly 关于:

    perl dangerous.pl 'rm -rfv *|'