错误的Perl Catch变量

时间:2012-01-18 19:53:04

标签: perl

我有一个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文件,代码会发送错误,这就是我想要的。但我需要知道的是,以某种方式可能获得导致错误的$文章的名称?我试图使用某种全局变量而没有运气。

4 个答案:

答案 0 :(得分:4)

为什么不把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 :(得分:1)

如果那是您的唯一问题,只需在eval之前声明my $article;,然后从my循环中删除for。但是从你对Cornel Ghiban的回复中,我怀疑它不是。

答案 2 :(得分:0)

die>/ string:

open my $ofh, '>:raw', "$article.pdf" or die "Could not write '$article': $!";
中加入文件名

我认为你想写,而不是读。除非您有权限问题或完整文件系统,否则写入可能会成功,您将永远不会看到错误。

答案 3 :(得分: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
}