三元运算符中的条件不会导致任何更改

时间:2013-02-01 16:58:09

标签: perl ternary-operator fizzbuzz

这是我的代码示例:

for $i(1..100){
   if ($i%15==0){$s="Divisible by 15"}
   elsif($i%5==0){$s="Divisible by 5"}
   else {$i%3==0 ? $s="Divisible by 3" : $s=$i};
   print $s."\n"}

这会显示部分正确的结果,如果一个数字可以被3整除,则显示“数字”而不是“可被3整除”。

输出示例:

1
2
3
4
Divisible by 5
6
7
8
9
Divisible by 5

PS:我必须在最低编号中编写此代码。可能的人物。 (代码如此迟缓的原因)

3 个答案:

答案 0 :(得分:3)

第四行被解析为

(((($i % 3) == 0) ? ($s = 'Divisible by 3') : $s) = $i)

意思是即使$i可以被3整除,分配看起来像

($s = 'Divisible by 3') = $i

一些修正:

$i%3==0 ? ($s="Divisible by 3") : ($s=$i)
$s = ($i%3==0 ? "Divisible by 3" : $i)

专业提示:B::Deparse对于解决这些问题非常有帮助。我运行了命令

perl -MO=Deparse,-p -e '$i%3==0 ? $s="Divisible by 3" : $s=$i'

准确了解问题所在。

答案 1 :(得分:0)

三元?:higher precedence而不是作业。使用parens来解决这个问题:

for my $i (1 .. 100) {
   my $s = "Divisible by ";
     $i%15==0 ? ($s .= 15)
   : $i%5==0  ? ($s .= 5)
   : $i%3==0  ? ($s .= 3)
   :            ($s  =$i);
   print "$s\n";
}

输出:

1
2
Divisible by 3
4
Divisible by 5
Divisible by 3
7
8
Divisible by 3
Divisible by 5

答案 2 :(得分:-1)

如果您想要一个字符较少的版本,

for $i(1..100){print(($i%3&&$i%5?$i:"Divisible by ".($i%5?3:$i%15?5:15))."\n");}

打印功能后的括号表示调用打印功能,而不是对表达式进行分组。由于括号是该函数的可选项而引起的。