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

その投稿のリストにあるスクリプトの1つをコピーしましたが、これは機能しているようです。

#! /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 が自分自身を呼び出すたびに、この戻り値をチェックする必要があります。true の場合、何らかの再帰呼び出しでファイルが見つかったので、自分自身を再度呼び出す必要はなく、true を返す必要もあります。false の場合、ファイルはまだ見つかっていないため、検索を続行する必要があります。

于 2008-12-19T16:31:42.410 に答える