2011-10-14 10 views
2

语境的ActiveState Perl的: 这是Perl 5中,12版,颠覆4(v5.12.4)为MSWin32 86多线程构建为什么Perl的bignum模块为我的功耗计算提供了一个奇怪的结果?

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

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

然后我开始想,也许我需要划定负面的两个。

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

终于搞明白了。

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

那么为什么所有的括号?

+3

使用'use warn ';(或'-w')!!! – ikegami

回答

9

This thread涵盖了你的两个问题(你必须稍微查找对应于print (-2) ** 32的部分)。

总结还有什么:

  • 对于你的第一个问题(perl -Mbignum=l -e "print -2 ** 32"):在Perl幂比目负更高的优先级。
  • 对于第二个问题(perl -Mbignum=l -e "print (-2) ** 32"):关键是print文档中的以下警告。

    还要注意不要使用左括号跟随print关键字,除非您想让相应的右括号终止打印的参数 - 插入a或在所有参数周围插入括号。

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)为被称为与-2为参数的函数print)。

3

它不是一个BIGNUM相关的问题,如果你试试这个:

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

你:-2

那么“问题”与打印功能的参数格式

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 
相关问题