2012-01-18 4 views
0

У меня есть сценарий Perl, и я пытаюсь сделать его распечатывать значение для статьи $, когда это ошибка. Сценарий выглядит так:Perl Catch Variable in error

eval{ 
    for my $article($output =~ m/<value lang_id="">(.*?)<\/value>/g) 
    { 
     $article =~ s/ /+/g; 
     $agent->get("someurl"); 

     $agent->follow_link(url_regex => qr/(?i:pdf)/); 

     my $pdf_data = $agent->content; 
     open my $ofh, '>:raw', "$article.pdf" 
     or die "Could not write: $!"; 
     print {$ofh} $pdf_data; 
     close $ofh; 
     sleep 10; 
    } 
}; 
if([email protected]){ 
    print "error: ...: [email protected]\n"; 
} 

Так что, если нет .pdf-файла, код отправляет ошибку, которую я хочу. Но что мне нужно знать, так ли возможно получить имя статьи $, вызвавшей ошибку? Я пытался использовать какую-то глобальную переменную без везения.

ответ

4

Почему вы не ставите eval внутри цикла for? Что-то вроде этого:

for my $article($output =~ m/<value lang_id="">(.*?)<\/value>/g) 
{ 
    $article =~ s/ /+/g; 
    eval{ 
     # ... 
    } 
    if ([email protected]) { 
     print STDERR "Error handling article: ", $article, " ", $!, "\n"; 
    } 
} 
+0

По какой-то причине, когда я делаю что он печатает каждый PDF не только те, равный $ статью из за цикл – chrstahl89

+0

ITYM 'печать STDERR«Ошибки обработки статьи $ статьи: $ @ \ п»;' (не '$!'). И вы можете использовать 'warn' вместо' print STDERR'. Но в целом эта работа должна быть; если это не работает для @ chrstahl89, проблема, вероятно, где-то внутри eval. –

+0

@ chrstahl89: Можете ли вы опубликовать фактический код, который «печатает каждый PDF»? –

0

Включите имя файла в die>/ string:

open my $ofh, '>:raw', "$article.pdf" or die "Could not write '$article': $!"; 

I assume that you want to write and not read. Unless you have a permission issue or a full file system, a write is likely to succeed and you will never see an error.

+1

Это не сработает, потому что ошибка связана с получением ссылки, она никогда не идет писать. – chrstahl89

+0

Это было непонятно мне в вашем первоначальном вопросе. Тем не менее, последующая ссылка возвращает undef, когда страница не имеет ссылок или ссылка может быть найдена. Вы можете сделать исключение для этого. – JRFerguson

+0

Я думаю, что это будет ответ, просто нужно выяснить, как выбросить ошибку. Хорошо поймаем ошибку ... она уже бросает ее. – chrstahl89

1

If that's your only problem, just declare my $article; перед Eval, и удалить my из цикла for. Но из вашего ответа Корнелу Гибану, я подозреваю, что это не так.

0

Ваш скрипт не должен умирать, вы можете просто установить флаг или сохранить сообщение в журнал или сохранить ошибку для поздней обработки.

my @errors=(); 
................ 
open my $ofh, '>:raw', "$article.pdf" or do { push @errors,"$article: $!" }; 
if(-e $ofh) { 
    # work with the file 
} 
................ 
if(@errors) { 
    # do something 
}