Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 更好的方法使用如果条件_Perl_If Statement_Coding Style - Fatal编程技术网

Perl 更好的方法使用如果条件

Perl 更好的方法使用如果条件,perl,if-statement,coding-style,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)

我需要运行一个测试脚本,它有超过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条款不满意。有更好的方法吗

翻译成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;
}
或:

如果您确实有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;
}

请注意,前三个备选方案将处理不同的函数调用签名,代码的布局更为混乱;最后一个几乎要求列表中的每个函数都具有相同的函数调用签名。

我想再注意一个选项:

通过=正确

已通过=已通过&&cond1 已通过=已通过&&cond2 ... 如果(通过)


当其中一个函数返回一个假值时,它使用停止求值。

请记住
&&
短路,这意味着在下面的语句中

func1 && func2
如果
func1
的计算结果为false,则永远不会计算
func2
,因为此后
&
永远不会为true

这意味着您可以复制您的功能,而无需任何
if
子句:

return func1 && func2 && func3 ...

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

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);
}

此样式允许轻松添加更多调用并轻松重新排序。

所有信号都发生了什么?我不喜欢在
if()中有多个赋值。
。第二个例子还可以,也许在perlFair中,
func()或die/return
更常见。考虑到后面的版本,我也不喜欢第一个;假设在问题中,这个值是一个布尔值,你可以避免赋值,只需测试函数的返回值,它将完成所有的步骤。从技术上讲,这不是最有效的方法。你是对的,但现代计算机担心一些测试的优化可能是在浪费人们的时间。更重要的是理解和维护程序的能力。最初的问题要求更好的方法来编写代码,我相信在某些方面,这会更好。@adiranhh你是对的。它比其他方法干净得多。我希望我能选择不止一个正确答案。
return func1 && func2 && func3 ...
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);
}