このモジュールを使用して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
その投稿のリストにあるスクリプトの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がトラバースしなくなったようです。
関数 processFile() は、ファイルが見つかった場合は true を返し、そうでない場合は false を返す必要があります。そのため、processFile が自分自身を呼び出すたびに、この戻り値をチェックする必要があります。true の場合、何らかの再帰呼び出しでファイルが見つかったので、自分自身を再度呼び出す必要はなく、true を返す必要もあります。false の場合、ファイルはまだ見つかっていないため、検索を続行する必要があります。