2010-06-29 117 views
1
$df{key} =10 ; return ; if $result == 10 ; 

给我一个错误。我怎样才能做到这一点?如何以多条语句为条件调用后置语句?

+0

你想做什么? – kennytm 2010-06-29 09:16:30

+0

$ df {key} = 10,如果$ result == 10则返回; – Tree 2010-06-29 09:40:25

+0

我希望你在我的回答中注意到了警告。 – Zaid 2010-06-29 09:45:18

回答

9

if的陈述后表单只适用于单个陈述。你必须附上多个语句块中的if条件,这本身需要用括号括起来后:

if ($result == 10) { 

    $df{key} = 10; 
    return; 
} 

在这种情况下,有可能有两种说法结合起来后陈述条件。这里的想法是通过执行布尔评估来将这两个语句合并为一个。

然而,这一般一个好主意,因为它可能会短路并未能做到你所期望的一样,当$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

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}; 
+0

我知道'do {} while'保证至少执行一次。这是否意味着'如果'会做同样的事情? – Zaid 2010-06-29 10:28:12

+0

我刚试过。 'do {print“hello \ n”} if 0;'不会按预期打印任何内容。 – hillu 2010-06-29 10:37:34

3

comma operator允许一个链在一起的多个语句到表达,之后就可以包括条件:

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

错误条件检查当我使用此经常构造:

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

不要忘记警告附近的括号,否则'警告'会吞噬'下一个'! – Zaid 2010-06-29 20:53:24

+0

@Zaid:好点!在我自己的代码中,'warn'实际上是'$ this-> warn(...)'所以括号已经存在了...或者我会被这个:) – Ether 2010-06-29 23:26:19