Переменная Perl Catch по ошибке - PullRequest
0 голосов
/ 18 января 2012

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

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($@){
    print "error: ...: $@\n";
}

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

Ответы [ 4 ]

4 голосов
/ 19 января 2012

Почему бы вам не поместить eval в цикл for? Примерно так:

for my $article($output =~ m/<value lang_id="">(.*?)<\/value>/g)
{ 
   $article =~ s/ /+/g;
   eval{
      # ...
   }
   if ($@) {
      print STDERR "Error handling article: ", $article, " ", $!, "\n";
   }
}
1 голос
/ 19 января 2012

Если это ваша проблема only , просто объявите my $article; перед eval и удалите my из цикла for. Но из вашего ответа Корнелу Гибан я подозреваю, что это не так.

0 голосов
/ 20 января 2012

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

my @errors=();
................
open my $ofh, '>:raw', "$article.pdf" or do { push @errors,"$article: $!" };
if(-e $ofh) {
    # work with the file
}
................
if(@errors) {
    # do something
}
0 голосов
/ 19 января 2012

Включите имя файла в die>/ string:</p> <pre>open my $ofh, '>:raw', "$article.pdf" or die "Could not write '$article': $!";

Я предполагаю, что вы хотите писать, а не читать.Если у вас нет проблем с правами доступа или полная файловая система, запись, вероятно, будет успешной, и вы никогда не увидите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...