在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;