Perl中的赋值三元条件运算符问题

问题描述:

我的程序中的这段Perl代码给出了错误的结果。Perl中的赋值三元条件运算符问题

$condition ? $a = 2 : $a = 3 ; 
print $a; 

无论$condition的值是多少,输出总是3,怎么回事?

这在Perl的documentation解释。

由于Perl运算符优先级的语句被解析为

($condition ? $a= 2 : $a) = 3 ; 

因为:操作者产生一个可分配的结果,3分配给的条件的结果。

当$条件为真此装置($ a = 2)= 3给予$ a = 3

当$条件为假此装置($ A)= 3给予$ a = 3

写这个正确的方法是

$a = ($condition ? 2 : 3); 
print $a; 

我们得到了这个工作咬伤,所以我在这里发帖,希望其他人会发现它很有用。

+1

“当$条件为真,这意味着$ a = 2 = 3给予$ A = 3” 我会想到$ a = 2 = 3将是一个表达式语法错误或左值所需错误或这些......究竟如何得到评估? – sundar 2008-10-11 13:08:43

+0

你是对的我会修改它是($ a = 2)= 3而不是$ a = 2 = 3 – Pat 2008-10-13 13:02:04

只是为了延续之前的答案...如果,无论出于何种原因,该分配需要是有条件的部分,你想把它正是如此写:

$condition ? ($a=2) : ($a=3); 

这将是如果有用的话您正在根据条件分配不同的变量。

$condition ? ($a=2) : ($b=3); 

如果你选择的变量,但不管如何分配同样的事情,你甚至可以做到这一点:

($condition ? $a : $b) = 3; 

建议之一以上Tithonium的回答是:

如果你想为不同的值赋给同一个变量,这可能会更好(拷贝书的方式):

$ a =($条件)? 2:3;

一旦你有,你可以从优先级问题,是患了端倪,一招弄清楚什么的Perl以为你的意思是:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;' 

在你的情况下,会告诉你:

(($condition ? ($a = 2) : $a) = 3); 
print($a); 
-e syntax OK 

......在这一点上,你应该说“哦,解释它”!

由于Perl运算符优先级的语句被解析为:

($condition ? $a = 2 : $a) = 3 ; 

因为:操作者产生一个可分配的结果,3分配给的条件的结果。

当$条件为真,这意味着$ a = 2 = 3捐赠$ a = 3

当$条件为假,这意味着$ a = 3捐赠$ a = 3

的正确方法写这篇文章是

$a = $condition ? 2 : 3; 

在一般情况下,你应该真正走出使用条件语句来做分配,如在原来的例子的习惯 - 这是诸如此类的事情,导致Perl中获得了声誉在写-只要。

一个好的经验法则是,条件只适用于简单的值,从来没有副作用的表达式。当你或其他人需要从现在开始八个月后阅读此代码时,你是否更喜欢这样阅读?

$x < 3 ? foo($x) : bar($y); 

还是这样?

if ($x < 3) { 
    $foo($x); 
} else { 
    $bar($y); 
}