Как я могу убежать из рекурсивной функции находки, после того как определенный файл найден?

Я не уверен, почему вы используете так много вложенных структур, но вам нужно nonlocal вместо global - в случае, если ваша версия Python позволяет это.

5
задан brian d foy 19 December 2008 в 18:53
поделиться

6 ответов

Кажется, что необходимо будет умереть:

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

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


sub processFile() {
   if ($_ =~ /target/) {
      die 'found it';
   }
}
9
ответ дан 14 December 2019 в 04:49
поделиться

В дополнение к тому, что все остальные сказали, можно хотеть смотреть на File-Find-Object, который является и повторяющимся (и как таковой способный к тому, чтобы быть прерванным в середине) и способный к инстанцированию (таким образом, можно инициировать и использовать несколько сразу или инстанцировать F-F-O основанного на объектах при выполнении другого сканирования, и т.д.),

Оборотная сторона для него - то, что это не ядро, но это только имеет Класс:: Средство доступа как зависимость, и является чистым Perl, таким образом, не должно быть трудно установить.

Я должен предупредить Вас, что я - его специалист по обслуживанию, таким образом, я могу быть немного смещен.

3
ответ дан 14 December 2019 в 04:49
поделиться

Вы могли использовать названные блоки и переход к нему при нахождении результата (со следующим, в последний раз, это зависит от того, в чем Вы нуждаетесь).

0
ответ дан 14 December 2019 в 04:49
поделиться

Можно ли выдать пользовательские исключения в Perl?

1
ответ дан 14 December 2019 в 04:49
поделиться

Я нашел эту ссылку:

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:: Найдите:: чернослив.

-1
ответ дан 14 December 2019 в 04:49
поделиться

Функция processFile () должна возвратить true, если это находит файл и ложь иначе. Так, каждый раз, когда processFile называет себя, должен проверить это возвращаемое значение. Если это верно, некоторый рекурсивный вызов нашел файл, таким образом, нет никакой потребности назвать себя снова, и это должно также возвратить true. Если это - ложь, файл еще не был найден, и это должно продолжить поиск.

-4
ответ дан 14 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: