2

Perl の short circuited and で奇妙な結果が発生してい&&ます。

特定の数値を数値のリストで割り切れるようにするプロジェクト オイラーの問題を解決しようとしています。

$b=42;

if($b%21==0 && b%2==0 && b%5==2){print "Why not?"};

"Why not"私が見ることができる限り印刷する必要がありますが、黙っています。

$b=42;

if($b%21==0 && b%2==0 && b%5==0){print "WTF?"};

黙っているべきですが、出力し"WTF?"ます。

何を与える?

4

3 に答える 3

10

Rohitが答えたように、解決策はの$前にを追加することbです。"Why not?"印刷せずに「」を出力する正確な理由"WTFは次のとおりです。記号なし(および強制なしb)で指定すると、Perlはを文字列として扱います。次に、演算子を適用すると、は数値演算子であるため、 Perlは文字列内を調べ、数値で始まるかどうかをチェックします。そうでないため、Perlは数値0を取り、mod(%)演算を適用します。0%5は2ではなく0であるため、印刷されたものではなく$use strict;b"b"%%"b""b"WTF"Why not?"

于 2012-11-24T11:44:14.517 に答える
8

常に と を使用use strictuse warningsます。

最後の 2 つb'sをベアワードとして使用しているため、警告として表示されます -"Unquoted string "b" may clash with future reserved word"

次のように変更する必要がありますif: -

if($b%21==0 && $b%2==0 && $b%5==2){print "Why not?"};

と: -

if($b%21==0 && $b%2==0 && $b%5==0){print "WTF?"};

期待される結果が得られます。

于 2012-11-24T11:31:19.090 に答える
2

if($b%21==0 && $b%2==0 && $b%5==2){print "なぜ?"};

ここで動作します。$ を忘れましたが、どうやら既に見つかっているようです :)

于 2012-11-24T11:33:44.823 に答える