考虑以下包装函数,如果函数抛出(不知道为什么格式不稳定),它会重试给定函数给定的次数:
sub tryit{
my $fun = shift;
my $times = shift;
my @args = @_;
my $ret;
do{
$times--;
eval{
$ret = $fun->(@args);
};
if($@){
print "Error attemping cmd: $@\n";
}
else{
return $ret;
}
}while($times > 0);
return;
}
如何扩展,使参数函数的返回值无论返回什么样的值都能正确传播?例如,此函数不会正确传递数组。你不能只返回 $fun->() 因为返回只会带你离开 eval 块。
最佳答案
与 Nemo 相同的基本答案,但有一些改进:
wantarray
将为您提供所需的信息。sub tryit {
my $func = shift;
my $attempts = shift;
my $list_wanted = wantarray;
my @rv;
for (2..$attempts) {
if (eval{
if ($list_wanted) {
@rv = $func->(@_);
} else {
$rv[0] = $func->(@_);
}
1 # No exception
}) {
return $list_wanted ? @rv : $rv[0];
}
warn($@, "Retrying...\n");
}
return $func->(@_);
}
空上下文作为空上下文传播,但这可能是可以接受的。如果没有,则很容易调整。
关于perl - 这个 perl 包装函数可以扩展到任何输入函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6181668/