查找文件并在perl脚本中的第一个匹配后返回

时间:2014-01-15 13:49:05

标签: perl find

我正在使用perl的find。它有效,但我希望在找到第一个匹配后返回(退出)想要的subrutine,我想停止查找。我把回报但它不起作用。 这是我的代码:

find(\&wanted, $dir);

sub wanted {
    print "Found it $File::Find::dir/$_\n" if /$file/i; 
        $found_file = "$File::Find::dir/$_";  
        return "$File::Find::dir/$_";
}

print $found_file;

$ dir是我搜索的目录,$ file是我需要的文件。

我应该把返回者放在想要的地方。我是perl的新手,感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

File::Find是一个古怪的模块。它几乎要求您在wanted部分内编写整个程序的代码。如果你不想这样做,你通常需要使用某种严重范围的变量,这会让事情看起来很难看。此外,它使用单独的子程序,使代码更难以遵循。

问题是File::Find不是面向对象的。如果是,你可以使用方法在循环中获取文件,当你得到你想要的文件时,你可以离开循环。

幸运的是,已经有一个File::Find::Object,它是File::Find的面向对象版本。

sub find_file {
    my @directories = @_;
    my $dir_tree = File::Find::Object->new( @directories );

    while ( my $file = $dir_tree->next ) {
      next unless ... # Code used to determine if file is what you want
      return $file
    }
    return;   #Nothing found
}

界面干净,易于理解。这是File::Find应该如何运作的。我不知道为什么它不是标准的分发模块。


File::Find的主要问题是它已经过时(从Perl 3.x开始),并且从未真正打算成为模块。这是为了与Perl发行版附带的find2perl程序一起使用。想看到丑陋和可怕的东西?通过find2perl运行查找查询并查看结果。这就是旧的Perl代码看起来的样子。