如果条件更好的方式使用

时间:2013-09-01 07:55:59

标签: perl if-statement coding-style

我需要运行一个有超过10个条件的测试脚本来验证。如果任何步骤失败,程序将失败,并且不会执行进一步的步骤。目前,我的计划是这样的:

boolean status = 0;

status = function1(param1, param2);
if (status) {
   status = function2(param1, param2);
   if(status) {
      status = function3(param1, param2);
      if(status) {
         status = function4(param1, param2);
      }
      :
      :
      :
   }
} 

return status;

我对这么多嵌入式IF条款感到不满意。有没有更好的方法呢?

5 个答案:

答案 0 :(得分:4)

翻译成Perl,你可以写:

sub testing
{
    my $status;

    if (($status = function1($param1, %param2)) &&
        ($status = function2($param1, %param2)) &&
        ($status = function3($param1, %param2)) &&
        ($status = function4($param1, %param2)))
    {
        # ...do whatever...
    }

    return $status;
}

或者,假设$status只是一个布尔值:

sub testing
{
    return 0 if !function1($param1, %param2) ||
                !function2($param1, %param2) ||
                !function3($param1, %param2) ||
                !function4($param1, %param2);

    # ...do whatever...

    return 1;
}

或者:

sub testing
{
    return 0 unless function1($param1, %param2);
    return 0 unless function2($param1, %param2);
    return 0 unless function3($param1, %param2);
    return 0 unless function4($param1, %param2);
    # ...do whatever...
    return 1;
}

如果你真的有10个具有相同呼叫签名的功能,那么你甚至可以这样做:

sub testing
{
    my @funcs = ( &function1, &function2, &function3, &function4, &function5,
                  &function6, &function7, &function8, &function9, &function10,
                );

    for my $funcref (@funcs)
    {
        return 0 unless &$funcref($param1, %param2);
    }

    # ...do whatever...

    return 1;
}

请注意,前三个选项将处理不同的函数调用签名,只需更简洁的代码布局;最后几乎需要在列表中的每个函数上使用相同的函数调用签名。

答案 1 :(得分:3)

return function1($param1, %param2) &&
       function2($param1, %param2) &&
       function3($param1, %param2) &&
       function4($param1, %param2);

只要其中一个函数返回false值,就会使用short-circuit来停止评估。

答案 2 :(得分:2)

请记住&&短路,这意味着在以下声明中

func1 && func2

如果func1评估为false,则永远不会评估func2,因为此后&&永远不会为真。

这意味着您可以在没有任何if子句的情况下复制您的功能:

return func1 && func2 && func3 ...

答案 3 :(得分:0)

我想再提一个选项:

传递=真

传递=传递&& COND1 传递=传递&& COND2 ... 如果(通过)......

答案 4 :(得分:0)

另一个避免所有嵌套但与原始嵌套类似的选项:

boolean status = 0;

status = function1(param1, param2);
if (status) {
    status = function2(param1, param2);
}
if (status) {
    status = function3(param1, param2);
}
if (status) {
    status = function4(param1, param2);
}

此样式可以轻松添加更多呼叫并轻松重新排序。