gpt4 book ai didi

perl - 这个 perl 包装函数可以扩展到任何输入函数吗?

转载 作者:行者123 更新时间:2023-12-01 06:33:15 25 4
gpt4 key购买 nike

考虑以下包装函数,如果函数抛出(不知道为什么格式不稳定),它会重试给定函数给定的次数:


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 相同的基本答案,但有一些改进:

  • 更安全的异常处理。
  • 未捕获最后一次尝试的异常。
  • 错误发送到 STDERR。
  • 删除了额外的换行符。
  • 更清洁的循环。
  • 更好的变量名。


  • 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com