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

4行目は次のように解析されます

(((($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

三元?:は割り当てよりも優先されます。それを整理するために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
于 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 に答える