在Perl中分配三元条件运算符的问题

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

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

不pipe$condition的值是多less,输出总是3,怎么回事?

这在Perl 文档中有解释。

由于Perl运算符的优先级,语句被parsing为

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

由于?:运算符产生一个可指定的结果,所以该条件的结果赋值为3。

当$条件为真时,这意味着($ a = 2)= 3给$ a = 3

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

写这个的正确方法是

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

我们在工作中受到了困扰,所以我在这里张贴希望别人会发现它有用。

一旦你有一个暗示,你可能会遇到优先问题,一个窍门,弄清楚什么Perl认为你的意思是:

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

在你的情况,这将告诉你:

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

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

只是为了扩大以前的答案…如果,无论出于何种原因,作业需要成为条件的一部分,你会想这样写:

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

如果您根据条件分配不同的variables,这将会很有用。

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

如果你select了variables,但是不pipe分配什么,你甚至可以这样做:

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

由于Perl运算符的优先级,语句被parsing为:

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

由于?:运算符产生一个可指定的结果,所以该条件的结果赋值为3。

当$条件为真时,这意味着$ a = 2 = 3给出$ a = 3

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

写这个的正确方法是

 $a = $condition ? 2 : 3; 

一般来说,你应该放弃使用条件来做分配的习惯,就像在原来的例子中一样 – 这种事情导致Perl获得只写的声誉。

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

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

或者像这样?

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

对Tithonium的回答有上面的build议:

如果你想分配不同的值给同一个variables,这可能会更好(复印方式):

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