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

标签 perl eval

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


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/

    相关文章:

    perl - 在 Perl 中,使用模块比使用文件更好吗?

    perl - 我如何在没有提示的情况下提供Maven发布准备信息?

    perl - 向原型(prototype)添加可选参数

    perl - Bash/shell 错误运行 perl -e 'use [module]' : Can't find string terminator "' "anywhere before EOF at -e line 1

    python - 何时使用 DataFrame.eval() 与 pandas.eval() 或 Python eval()

    linux - 如何在 Unix/Linux 中提取两个括号之间的单词?

    带有base64编码字段的javascript eval json

    ios - 如何在 Objective C (iOS) 中将字符串转换为对象变量

    php - 也许 PHP eval 范围的事情?

    Python:如何使用字符串索引( '[0][1][0]')作为多维数组的索引