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

时间:2020-03-05 18:39:13  来源:igfitidea点击:

我的程序中的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);
}