三元生成与 If 不同的结果
Ternary producing different results than If
编辑:对于遇到此问题的任何人,我在 https://perldoc.perl.org/perlop#Conditional-Operator
的 perldoc 中几乎逐字记录了此内容
在编写一个简单的子例程时,我发现使用三元运算符总是得到不正确的结果,但使用更简单的 if 语句却得到正确的结果。我确定有解释,但我只是没有看到它。
当输入以下内容时:
my @input = (4, 5, 7, 8, 1, 2, 3, 0);
sum_square_even_root_odd(\@input);
结果应该是 91.61。
以下(使用三进制)结果为 175.61。
sub sum_square_even_root_odd {
my ($nums) = @_;
my $sum = 0;
map { $_ % 2 ? $sum+= sqrt $_ : $sum += $_ ** 2 } @{$nums};
return sprintf('%.2f', $sum) + 0;
};
然而,结果是简单地更改为 if 语句时的预期结果
sub sum_square_even_root_odd {
my ($nums) = @_;
my $sum = 0;
map { if( $_ % 2 ) { $sum+= sqrt $_ } else { $sum += $_ ** 2 } } @{$nums};
return sprintf('%.2f', $sum) + 0;
};
有人可以解释为什么会这样吗?我假设一个我不期望的值正在偷偷进入 $_,但我不确定为什么。
谢谢!
事实上,这是一个优先级问题。诊断优先级问题的方法是 B::Deparse
:
$ perl -MO=Deparse,-p -e 'map { $_ % 2 ? $sum+= sqrt $_ : $sum += $_ ** 2 } @ARGV'
map({((($_ % 2) ? ($sum += sqrt($_)) : $sum) += ($_ ** 2));} @ARGV);
-e syntax OK
啊哈,:
的优先级高于其右侧的 +=
。做你的意思,在三元运算的最后一个子句上使用括号:
$_ % 2 ? $sum+= sqrt $_ : ($sum += $_ ** 2)
编辑:对于遇到此问题的任何人,我在 https://perldoc.perl.org/perlop#Conditional-Operator
的 perldoc 中几乎逐字记录了此内容在编写一个简单的子例程时,我发现使用三元运算符总是得到不正确的结果,但使用更简单的 if 语句却得到正确的结果。我确定有解释,但我只是没有看到它。
当输入以下内容时:
my @input = (4, 5, 7, 8, 1, 2, 3, 0);
sum_square_even_root_odd(\@input);
结果应该是 91.61。
以下(使用三进制)结果为 175.61。
sub sum_square_even_root_odd {
my ($nums) = @_;
my $sum = 0;
map { $_ % 2 ? $sum+= sqrt $_ : $sum += $_ ** 2 } @{$nums};
return sprintf('%.2f', $sum) + 0;
};
然而,结果是简单地更改为 if 语句时的预期结果
sub sum_square_even_root_odd {
my ($nums) = @_;
my $sum = 0;
map { if( $_ % 2 ) { $sum+= sqrt $_ } else { $sum += $_ ** 2 } } @{$nums};
return sprintf('%.2f', $sum) + 0;
};
有人可以解释为什么会这样吗?我假设一个我不期望的值正在偷偷进入 $_,但我不确定为什么。
谢谢!
事实上,这是一个优先级问题。诊断优先级问题的方法是 B::Deparse
:
$ perl -MO=Deparse,-p -e 'map { $_ % 2 ? $sum+= sqrt $_ : $sum += $_ ** 2 } @ARGV'
map({((($_ % 2) ? ($sum += sqrt($_)) : $sum) += ($_ ** 2));} @ARGV);
-e syntax OK
啊哈,:
的优先级高于其右侧的 +=
。做你的意思,在三元运算的最后一个子句上使用括号:
$_ % 2 ? $sum+= sqrt $_ : ($sum += $_ ** 2)