2

コンテキスト: ActiveState Perl: これは、MSWin32-x86-multi-thread 用にビルドされた perl 5、バージョン 12、サブバージョン 4 (v5.12.4) です。

>perl -Mbignum=l -e "print 2 ** 32"
4294967296

>perl -Mbignum=l -e "print -2 ** 32"
-4294967296

次に、負の 2 を区切る必要があるかもしれないと考えました。

>perl -Mbignum=l -e "print (-2) ** 32"
-2

最後にそれを理解しました。

>perl -Mbignum=l -e "print ((-2) ** 32)"
4294967296

では、なぜすべての括弧が来るのでしょうか?

4

4 に答える 4

9

このスレッドは、両方の質問をカバーしています (に対応する部分を見つけるには、少し下に移動する必要がありますprint (-2) ** 32)。

そこにあるものを要約すると:

  • 最初の問題 ( perl -Mbignum=l -e "print -2 ** 32") について: Perl では、べき乗は単項否定よりも優先されます。

  • 2 番目の問題 ( perl -Mbignum=l -e "print (-2) ** 32") の場合: キーは、printのドキュメントにある次の警告です。

    また、対応する右括弧で print への引数を終了させたい場合を除き、print キーワードの後に​​左括弧を付けないように注意してください。+ を挿入するか、すべての引数を括弧で囲みます。

于 2011-10-14T06:43:20.913 に答える
4

これはbignumとは関係ないと思います。

$ perl -MO=Deparse -e "print 2 ** 32"
print 4294967296; # regular case
$ perl -MO=Deparse -e "print -2 ** 32"
print -4294967296; # ** has higher precedence than -
$ perl -MO=Deparse -e "print (-2) ** 32"
print(-2) ** 32; # parentheses parsed as function application
$ perl -MO=Deparse -e "print ((-2) ** 32)"
print 4294967296; # finally what you want

私は、関数の適用があなたのビットだと思います(引数として呼び出されるprint (-2)関数として解析します)。print-2

于 2011-10-14T06:43:21.303 に答える
3

これを試してみると、bignum関連の問題ではありません:

perl -e "print (-2) + 32"

あなたが得る:-2

したがって、「問題」は、印刷関数の引数形式にあります

于 2011-10-14T06:44:36.620 に答える
2

定数を変数に置き換えると、B::Deparse は perl がコードを解析する方法を表示します。

$ perl -MO=Deparse,-p -e " print $fa ** $fb "
print(($fa ** $fb));
-e syntax OK

$ perl -MO=Deparse,-p -e " print -$fa ** $fb "
print((-($fa ** $fb)));
-e syntax OK

$ perl -MO=Deparse,-p -e " print (-$fa ) ** $fb "
(print((-$fa)) ** $fb);
-e syntax OK

$ perl -MO=Deparse,-p -e " print ( (-$fa ) ** $fb )"
print(((-$fa) ** $fb));
-e syntax OK
于 2011-10-15T11:12:46.230 に答える