Perl捕获变量出错
我有一个Perl脚本,我试图让它在出错时打印$article的值。脚本如下所示:Perl捕获变量出错,perl,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/
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";
}
eval{
对于我的$article($output=~m/(.*)/g)
{
$article=~s/+/+/g;
$agent->get(“someurl”);
$agent->follow_链接(url_regex=>qr/(?i:pdf)/);
my$pdf_data=$agent->content;
打开我的$ofh,'>:raw',“$article.pdf”
或者死“不能写:$!”;
打印{$ofh}$pdf_数据;
关闭$ofh;
睡眠10;
}
};
如果($@){
打印“错误:…:$@\n”;
}
因此,如果没有.pdf文件,代码将发送一个错误,这正是我想要的。但我需要知道的是,是否可能以某种方式获得导致错误的$article的名称?我试图使用某种全局变量,但运气不好。为什么不将eval放在for循环中?大概是这样的:
for my $article($output =~ m/<value lang_id="">(.*?)<\/value>/g)
{
$article =~ s/ /+/g;
eval{
# ...
}
if ($@) {
print STDERR "Error handling article: ", $article, " ", $!, "\n";
}
}
用于我的$article($output=~m/(.*)/g)
{
$article=~s/+/+/g;
评估{
# ...
}
如果($@){
打印STDERR“错误处理文章:,$article,,$!,“\n”;
}
}
为什么不将eval放在for循环中?大概是这样的:
for my $article($output =~ m/<value lang_id="">(.*?)<\/value>/g)
{
$article =~ s/ /+/g;
eval{
# ...
}
if ($@) {
print STDERR "Error handling article: ", $article, " ", $!, "\n";
}
}
用于我的$article($output=~m/(.*)/g)
{
$article=~s/+/+/g;
评估{
# ...
}
如果($@){
打印STDERR“错误处理文章:,$article,,$!,“\n”;
}
}
在模具>/字符串中包含文件名:
open my $ofh, '>:raw', "$article.pdf" or die "Could not write '$article': $!";
打开我的$ofh,“>:raw',“$article.pdf”或“die”无法写入“$article':$!”;
我假设你想写而不是读。除非您有权限问题或有完整的文件系统,否则写入很可能会成功,并且您永远不会看到错误。在
die>/string中包含文件名:
open my $ofh, '>:raw', "$article.pdf" or die "Could not write '$article': $!";
打开我的$ofh,“>:raw',“$article.pdf”或“die”无法写入“$article':$!”;
我假设你想写而不是读。除非您有权限问题或有完整的文件系统,否则写操作很可能会成功,并且您永远不会看到错误。如果这是您唯一的问题,只需声明
我的$article代码>在评估之前,并从for
循环中删除my
。但从您对Cornel Ghiban的回复来看,我怀疑不是这样。如果这是您唯一的问题,只需声明我的$article代码>在评估之前,并从for
循环中删除my
。但从您对Cornel Ghiban的回复来看,我怀疑不是这样。您的脚本不需要终止,您只需设置一个标志或将消息保存到日志或存储错误以进行延迟处理即可
my @errors=();
................
open my $ofh, '>:raw', "$article.pdf" or do { push @errors,"$article: $!" };
if(-e $ofh) {
# work with the file
}
................
if(@errors) {
# do something
}
您的脚本不需要终止,您只需设置一个标志或将消息保存到日志或存储错误以进行后期处理
my @errors=();
................
open my $ofh, '>:raw', "$article.pdf" or do { push @errors,"$article: $!" };
if(-e $ofh) {
# work with the file
}
................
if(@errors) {
# do something
}
出于某种原因,当我这样做时,它会打印每个pdf,而不仅仅是For loopITYMprint STDERR“Error handling article$article:$@\n”中与$article相等的pdf代码>(不是$!
)。您可以使用warn
而不是print STDERR
。但总的来说,这应该是可行的;如果@chrstahl89不起作用,问题可能在评估中的某个地方。@chrstahl89:你能发布“打印每个pdf”的实际代码吗?将其发布到我的原始问题另一部分是我的代码出错,这是正确的解决方案我当时并不知道。谢谢出于某种原因,当我这样做时,它会打印每个pdf,而不仅仅是For loopITYMprint STDERR“Error handling article$article:$@\n”中与$article相等的pdf代码>(不是$!
)。您可以使用warn
而不是print STDERR
。但总的来说,这应该是可行的;如果@chrstahl89不起作用,问题可能在评估中的某个地方。@chrstahl89:你能发布“打印每个pdf”的实际代码吗?将其发布到我的原始问题另一部分是我的代码出错,这是正确的解决方案我当时并不知道。谢谢这将不起作用,因为错误来自获取链接,它永远不会写入。在你最初的问题中,我不清楚这一点。也就是说,当页面没有链接或链接可以链接时,follow link返回undf;找不到。你可以为此抛出一个异常。我想这就是答案,你只需要找出如何抛出一个错误就可以了。好的,捕获错误…它已经抛出了它。这将不起作用,因为错误来自获取链接,它永远不会写入。在你最初的问题中,我不清楚这一点。也就是说,当页面没有链接或链接可以链接时,follow link返回undf;找不到。你可以为此抛出一个异常。我想这就是答案,你只需要找出如何抛出一个错误就可以了。好吧,抓住错误…它已经抛出了错误。