我正在使用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的新手,感谢任何帮助。感谢。
答案 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代码看起来的样子。