我的程序中的这段 Perl 代码给出了错误的结果。
$condition ? $a = 2 : $a = 3 ;
print $a;
不管value$condition
是多少,输出总是3,怎么会?
我的程序中的这段 Perl 代码给出了错误的结果。
$condition ? $a = 2 : $a = 3 ;
print $a;
不管value$condition
是多少,输出总是3,怎么会?
Perl文档中对此进行了解释。
由于 Perl 运算符优先级,该语句被解析为
($condition ? $a= 2 : $a ) = 3 ;
因为 ?: 运算符产生一个可赋值的结果,所以将 3 赋值给条件的结果。
当 $condition 为真时,这意味着 ($a=2)=3 给出 $a=3
当 $condition 为假时,这意味着 ($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);
如果您根据条件分配给不同的变量,这将很有用。
$condition ? ($a=2) : ($b=3);
如果您选择变量,但无论如何分配相同的东西,您甚至可以这样做:
($condition ? $a : $b) = 3;
由于 Perl 运算符优先级,该语句被解析为:
($condition ? $a = 2 : $a ) = 3 ;
因为 ?: 运算符产生一个可赋值的结果,所以将 3 赋值给条件的结果。
当 $condition 为真时,这意味着 $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);
}
对以上Tithonium回答的一个建议:
如果您想为同一个变量分配不同的值,这可能会更好(抄本方式):
$a = ($条件) ? 2:3;