我不清楚为什么下面的代码会给我错误:
在组合_op_test.pl 第 12 行使用未初始化值加法 (+)。
我希望 $success_count
的值在每次迭代时按子例程返回的值递增。
这是代码:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.014;
use Try::Tiny;
my $success_count = 0;
for ( 1..10 ) {
$success_count += error_causing_sub();
}
sub error_causing_sub {
try {
die ("Error.");
} catch {
} finally {
if (@_) {
say "Error occured.";
return 0;
}
else {
say "Error did not occur.";
return 1;
}
};
}
感谢任何帮助。
最佳答案
如 CAVEATS 中所述文档部分中,return
不是从 sub 返回,而是从 finally
返回:
return
returns from thetry
block, not from the parentsub
(note that this is also howeval
works, but not howTryCatch
works):sub parent_sub { try { die; } catch { return; }; say "this text WILL be displayed, even though an exception is thrown"; }
如@simbabque notes ,finally
的返回值被忽略。如果try
失败,catch
的返回值是相关的,并且它是空的:
The return value of the
catch
block is not ignored, so if testing the result of the expression for truth on success, be sure to return a false value from thecatch
block: ...
下面的代码对我来说看起来更符合逻辑:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.014;
use Try::Tiny;
my $success_count = 0;
for ( 1..10 ) {
$success_count += error_causing_sub();
}
say $success_count;
sub error_causing_sub {
my $ret;
try {
die ("Error.") if rand(1) < 0.5;
say "Error did not occur.";
$ret = 1;
} catch {
say "Error occured.";
$ret = 0;
};
return $ret;
}
此外,据我所知,the issues with eval
that made Try::Tiny
relevant were fixed in 5.14 。因此,您最好只使用它:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.014;
my $success_count = 0;
$success_count += error_causing_sub() for 1 .. 10;
say $success_count;
sub error_causing_sub {
my $ret;
eval {
die ("Error.") if rand(1) < 0.5;
say "Error did not occur.";
$ret = 1;
} or do {
say "Error occured.";
$ret = 0;
};
return $ret;
}
关于perl - 为什么即使我从 Try::Tiny 的 finally block 返回一个值,也会收到 'use of uninitialized value' 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45865324/