Perl三元条件运算符问题中的赋值
我的程序中的Perl代码片段给出了错误的结果。
$condition ? $a = 2 : $a = 3 ; print $a;
不管$ condition的值是多少,输出始终为3,为什么呢?
解决方案
回答
Perl文档中对此进行了说明。
由于Perl运算符的优先级,该语句被解析为
($condition ? $a= 2 : $a ) = 3 ;
因为?:运算符会产生可分配的结果,所以将3分配给条件的结果。
当$ condition为true时,这意味着($ a = 2)= 3给出$ a = 3
当$ condition为假时,这意味着($ 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 =($ condition)? 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分配给条件的结果。
当$ condition为true时,这意味着$ a = 2 = 3给出$ a = 3
当$ condition为假时,这意味着$ a = 3给出$ a = 3
正确的写法是
$a = $condition ? 2 : 3;
通常,我们真的应该摆脱使用条件语句进行赋值的习惯,就像在原始示例中一样-这种事情使Perl以只写而闻名。
一条好的经验法则是,条件仅用于简单值,而不用于具有副作用的表达式。当我们或者其他人需要从现在开始八个月后阅读此代码时,我们是否希望它像这样阅读?
$x < 3 ? foo($x) : bar($y);
还是这样?
if ($x < 3) { $foo($x); } else { $bar($y); }