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;
我们得到了这个工作咬伤,所以我在这里发帖,希望其他人会发现它很有用。
只是为了延续之前的答案...如果,无论出于何种原因,该分配需要是有条件的部分,你想把它正是如此写:
$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);
}
“当$条件为真,这意味着$ a = 2 = 3给予$ A = 3” 我会想到$ a = 2 = 3将是一个表达式语法错误或左值所需错误或这些......究竟如何得到评估? – sundar 2008-10-11 13:08:43
你是对的我会修改它是($ a = 2)= 3而不是$ a = 2 = 3 – Pat 2008-10-13 13:02:04