我的程序中的这段 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 为 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);

如果您根据条件分配给不同的变量,这将很有用。

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

如果您选择变量,但无论如何分配相同的内容,您甚至可以这样做:

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

由于 Perl 运算符优先级,该语句被解析为:

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

因为?:运算符产生可赋值的结果,3 被赋值给条件的结果。

当 $condition 为 true 时,这意味着 $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);
}

对上面 Tithium 的回答的一个建议:

如果您想为同一个变量分配不同的值,这可能会更好(抄写方式):

$a = ($条件) ?2:3;

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top