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