一旦找到特定文件,我怎样才能打破递归查找功能?

时间:2008-12-19 16:04:59

标签: perl recursion file-find

我正在使用File::Find模块遍历目录树。找到特定文件后,我想停止搜索。我怎么能这样做?

   find (\$processFile, $mydir);

   sub processFile() {
      if ($_ =~ /target/) {
         # How can I return from find here?
      }
   }

6 个答案:

答案 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)

你能在Pe​​rl中抛出自定义异常吗?

答案 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。如果它为假,则尚未找到该文件,并且应该继续搜索。