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

时间:2008-08-12 16:03:55

标签: perl conditional-operator operator-precedence

我程序中的Perl代码片段给出了错误的结果。

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

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

5 个答案:

答案 0 :(得分:79)

Perl documentation中解释了这一点。

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

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

因为?:运算符产生可分配的结果,所以将3分配给条件的结果。

当$ condition为true时,这意味着($ a = 2)= 3给出$ a = 3

当$ condition为false时,这意味着($ a)= 3给出$ a = 3

写这个的正确方法是

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

我们在工作中被这个咬了,所以我在这里发帖,希望别人会发现它有用。

答案 1 :(得分:40)

一旦你知道你可能会遇到优先级问题,就可以找出Perl认为你的意思:

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

在你的情况下,那将告诉你:

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

......此时你应该说“哦,这就解释了”!

答案 2 :(得分:21)

只是为了扩展之前的答案...如果由于某种原因,作业需要成为条件的一部分,那么你想要这样写:

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

如果您根据条件分配不同的变量,这将非常有用。

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

如果您选择变量,但无论如何分配相同的东西,您甚至可以这样做:

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

答案 3 :(得分:4)

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

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

因为?:运算符产生可分配的结果,所以将3分配给条件的结果。

当$ condition为true时,这意味着$ a = 2 = 3给出$ a = 3

当$ condition为false时,这意味着$ a = 3给出$ a = 3

写这个的正确方法是

$a = $condition ? 2 : 3;

一般来说,你应该真正摆脱使用条件来进行赋值的习惯,就像在原始示例中一样 - 这是导致Perl因只写而声名鹊起的事情。

一个好的经验法则是条件仅适用于简单值,而不适用于具有副作用的表达式。如果您或其他人需要在八个月后阅读此代码,您是否愿意这样阅读?

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

或者喜欢这个?

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

答案 4 :(得分:0)

对Tithonium上面的回答提出了一个建议:

如果您想为同一个变量分配不同的值,这可能会更好(以书本方式):

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