如何以多个语句为条件调用后置语句?

时间:2010-06-29 09:08:05

标签: perl

$df{key} =10 ; return ; if $result == 10 ;

给了我一个错误。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:9)

if的后置陈述形式仅适用于单个陈述。在 if条件之后,您必须在块中包含多个语句,这些条件本身需要括在括号中:

if ( $result == 10 ) {

    $df{key} = 10;
    return;
}

在这种情况下,可以将两个语句与post语句条件组合。这里的想法是通过执行布尔评估将两个语句组合在一起。

然而,这通常是一个好主意,因为它可能会短路并且无法达到预期效果,例如$df{key} = 0

$df{key} = 10 and return if $result == 10;

来自perlsyn

  

在Perl中,定义范围的语句序列称为块

     

...通常,块用大括号分隔,也称为大括号。我们将这个语法结构称为BLOCK。

     

以下复合语句可用于控制流程:

     

if (EXPR) BLOCK

     

if (EXPR) BLOCK else BLOCK

     

if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK

答案 1 :(得分:4)

您可以将语句分组为do BLOCK并使用条件 该复合语句的语句修饰符。

do { $df{key} = 10; return } if $result == 10;

与Zaid发布的and构造不同,这并不含糊。您 但是,在使用条件语句之前应该三思而后行 修改。特别是混合if / unless语句 if / unless语句修饰符会降低代码的可读性。

在我看来,声明修饰符有意义的主要情况 是简单的错误路径,即:

croak "foo not specified" unless exists $args{foo};

答案 2 :(得分:4)

comma operator允许将多个语句链接到一个表达式中,之后您可以包含条件:

$df{key} = 10, return if $result == 10;

在检查错误情况时,我经常使用此构造:

for my $foo (something...)
{
    warn("invalid thing"), next unless $foo =~ /pattern/;
    # ...
}