2

这是我的代码示例:

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:我必须以最少的数量编写此代码。可能的字符数。(代码这么卡顿的原因)

4

3 回答 3

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'

看看到底是什么问题。

于 2013-02-01T17:11:03.873 回答
0

三元?:优先级高于赋值。使用括号来解决这个问题:

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
于 2013-02-01T17:10:10.413 回答
-1

如果你想要一个字符更少的版本,

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

print 函数后面的括号表示调用 print 函数,而不是对表达式进行分组。原因是括号对于该函数是可选的。

于 2013-02-01T17:44:04.077 回答