5

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

   find (\$processFile, $mydir);

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

6 回答 6

9

似乎你将不得不死:

eval {
    find (\$processFile, $mydir);
};

if ( $@ ) {
   if ( $@ =~ m/^found it/ ) {
        # be happy
    }
    else ( $@ ) {
        die $@;
    }
}
else {
   # be sad
}


sub processFile() {
   if ($_ =~ /target/) {
      die 'found it';
   }
}
于 2008-12-19T16:29:00.123 回答
3

除了其他人所说的之外,您可能希望看看File-Find-Object,它既是迭代的(因此能够在中间被中断)并且能够实例化(因此您可以启动和使用几个一次,或在执行另一次扫描时基于 FFO 对象实例化等)

它的缺点是它不是核心,但它只有 Class::Accessor 作为依赖项,并且是纯 Perl,因此安装起来应该不难。

我应该警告你,我是它的维护者,所以我可能有点偏见。

于 2008-12-19T19:53:02.177 回答
1

你能在 Perl 中抛出自定义异常吗?

于 2008-12-19T16:17:51.610 回答
0

如果找到结果,您可以使用命名块并跳转到它(下一个,最后一个,这取决于您的需要)。

于 2008-12-19T18:55:18.937 回答
-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 不再遍历。

于 2008-12-19T16:51:29.000 回答
-4

如果找到文件,函数 processFile() 应该返回 true,否则返回 false。所以,每次 processFile 调用自己时都应该检查这个返回值。如果为真,则递归调用已找到该文件,因此无需再次调用自己,它也必须返回真。如果它是假的,文件还没有找到,它应该继续搜索。

于 2008-12-19T16:31:42.410 回答