我正在使用File::Find
模块遍历目录树。找到特定文件后,我想停止搜索。我怎么能这样做?
find (\$processFile, $mydir);
sub processFile() {
if ($_ =~ /target/) {
# How can I return from find here?
}
}
答案 0 :(得分:9)
好像你将不得不死:
eval {
find (\$processFile, $mydir);
};
if ( $@ ) {
if ( $@ =~ m/^found it/ ) {
# be happy
}
else ( $@ ) {
die $@;
}
}
else {
# be sad
}
sub processFile() {
if ($_ =~ /target/) {
die 'found it';
}
}
答案 1 :(得分:3)
除了其他人所说的,你可能希望看看File-Find-Object,它既是迭代的(因此能够在中间被中断)并且能够实例化(所以你可以启动并且一次使用几个,或者在执行另一次扫描时实例化FFO对象等。)
它的缺点是它不是核心,但它只有Class :: Accessor作为依赖,并且是纯Perl所以它应该不难安装。
我应该警告你我是它的维护者,所以我可能有点偏颇。
答案 2 :(得分:1)
你能在Perl中抛出自定义异常吗?
答案 3 :(得分:0)
你可以使用命名块并跳转到它,如果你找到了你的结果(下一个,最后一个,它取决于你需要的)。
答案 4 :(得分:-1)
我找到了这个链接:
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不再遍历。
答案 5 :(得分:-4)
函数processFile()如果找到文件则返回true,否则返回false。因此,每次processFile调用自己时都应检查此返回值。如果是真的,一些递归调用找到了文件,所以不需要再次调用自己,它也必须返回true。如果它为假,则尚未找到该文件,并且应该继续搜索。