Я не уверен, почему вы используете так много вложенных структур, но вам нужно nonlocal
вместо global
- в случае, если ваша версия Python позволяет это.
Кажется, что необходимо будет умереть:
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, который является и повторяющимся (и как таковой способный к тому, чтобы быть прерванным в середине) и способный к инстанцированию (таким образом, можно инициировать и использовать несколько сразу или инстанцировать F-F-O основанного на объектах при выполнении другого сканирования, и т.д.),
Оборотная сторона для него - то, что это не ядро, но это только имеет Класс:: Средство доступа как зависимость, и является чистым Perl, таким образом, не должно быть трудно установить.
Я должен предупредить Вас, что я - его специалист по обслуживанию, таким образом, я могу быть немного смещен.
Вы могли использовать названные блоки и переход к нему при нахождении результата (со следующим, в последний раз, это зависит от того, в чем Вы нуждаетесь).
Я нашел эту ссылку:
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:: Найдите:: чернослив.
Функция processFile () должна возвратить true, если это находит файл и ложь иначе. Так, каждый раз, когда processFile называет себя, должен проверить это возвращаемое значение. Если это верно, некоторый рекурсивный вызов нашел файл, таким образом, нет никакой потребности назвать себя снова, и это должно также возвратить true. Если это - ложь, файл еще не был найден, и это должно продолжить поиск.