我正在使用该File::Find
模块来遍历目录树。找到特定文件后,我想停止搜索。我怎样才能做到这一点?
find (\$processFile, $mydir);
sub processFile() {
if ($_ =~ /target/) {
# How can I return from find here?
}
}
似乎你将不得不死:
eval {
find (\$processFile, $mydir);
};
if ( $@ ) {
if ( $@ =~ m/^found it/ ) {
# be happy
}
else ( $@ ) {
die $@;
}
}
else {
# be sad
}
sub processFile() {
if ($_ =~ /target/) {
die 'found it';
}
}
除了其他人所说的之外,您可能希望看看File-Find-Object,它既是迭代的(因此能够在中间被中断)并且能够实例化(因此您可以启动和使用几个一次,或在执行另一次扫描时基于 FFO 对象实例化等)
它的缺点是它不是核心,但它只有 Class::Accessor 作为依赖项,并且是纯 Perl,因此安装起来应该不难。
我应该警告你,我是它的维护者,所以我可能有点偏见。
你能在 Perl 中抛出自定义异常吗?
如果找到结果,您可以使用命名块并跳转到它(下一个,最后一个,这取决于您的需要)。
我找到了这个链接:
http://www.perlmonks.org/index.pl?node_id=171367
我复制了该帖子列表中的一个脚本,这似乎有效:
#! /usr/bin/perl -w
use strict;
use File::Find;
my @hits = ();
my $hit_lim = shift || 20;
find(
sub {
if( scalar @hits >= $hit_lim ) {
$File::Find::prune = 1;
return;
}
elsif( -d $_ ) {
return;
}
push @hits, $File::Find::name;
},
shift || '.'
);
$, = "\n";
print @hits, "\n";
看来这实际上是通过使用 $File::Find::prune 导致 find 不再遍历。
如果找到文件,函数 processFile() 应该返回 true,否则返回 false。所以,每次 processFile 调用自己时都应该检查这个返回值。如果为真,则递归调用已找到该文件,因此无需再次调用自己,它也必须返回真。如果它是假的,文件还没有找到,它应该继续搜索。