Как пропустить «умереть» в Perl - PullRequest
2 голосов
/ 13 июля 2011

Я пытаюсь извлечь данные с веб-сайта, используя Perl API. Процесс заключается в использовании списка Uris в качестве входных данных. Затем я извлекаю соответствующую информацию для каждого URI с веб-сайта. Если информация для одного URI отсутствует, он умирает. Что-то вроде кода ниже

my @tags = $c->posts_for(uri =>"$currentURI");
die "No candidate related articles\n" unless @tags;

Теперь я не хочу, чтобы программа остановилась, если у нее нет тегов. Я хочу, чтобы программа пропустила этот конкретный URI и перешла к следующему доступному URI. Как мне это сделать? Спасибо за ваше время и помощь.

Спасибо, Отжимают

Ответы [ 3 ]

5 голосов
/ 13 июля 2011

Что ж, если вы находитесь внутри цикла, обрабатывающего каждый из URI по очереди, вы сможете сделать что-то вроде:

next unless @tags;

Например, следующая программа печатает только строки с цифрами:

while (<STDIN>) {
    next unless /^\d+$/;
    print;
}

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

Тот же метод используется в этом первом блоке кода выше, чтобы перезапустить цикл, если нет тегов, переходя к следующему URI.

0 голосов
/ 13 июля 2011

Вопрос довольно странный, но насколько я могу судить, вы спрашиваете, как управлять потоком вашего токового контура.Конечно, использование die приведет к завершению работы вашей программы, поэтому, если вы этого не хотите, вам не следует использовать die.Мне кажется элементарным, вот почему это странные вопросы.

Итак, я предполагаю, что у вас есть цикл, такой как:

for my $currentURI (@uris) {
    my @tags = $c->posts_for(uri =>"$currentURI");
    die "No candidate related articles\n" unless @tags;
    # do stuff with @tags here....
}

И если @tags пусто, вы хотитеперейти к следующему URI.Ну, это простая вещь, чтобы решить.Есть много способов.

next unless @tags;
for my $tag (@tags) { ... stuff ... }
if (@tags) { .... }

Далее идет самый простой.Он пропускает до конца блока цикла и начинается со следующей итерации.Однако использование блока for или if приводит к тому же поведению, и поэтому эквивалентны.Например:

for my $currentURI (@uris) {
    my @tags = $c->posts_for(uri =>"$currentURI");
    for my $tag (@tags) {
        do_something($tag);
    }
}

Или даже:

for my $currentURI (@uris) {
    for my $tag ($c->posts_for(uri =>"$currentURI")) {
        do_something($tag);
    }
}

В этом последнем примере мы удалили @tags все вместе, потому что это не нужно.Внутренний цикл будет выполняться ноль раз, если нет «тегов».

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

0 голосов
/ 13 июля 2011

Помимо традиционных инструментов управления потоком, то есть next / last в цикле или return в подпрограмме, в perl можно использовать исключения:

eval {
    die "Bad bad thing";
};
if ($@) {
    # do something about it
};

Или просто используйте Попробуйте :: Tiny .

Однако из описания задачи кажется, что next достаточно (поэтому я проголосовал за ответ @ paxdiablo).

...