2011-10-14 3 views
2

컨텍스트 : ActiveState의 펄 : 이 펄 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 

, 어쩌면 구분해야 부정적인 2.

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

마지막으로 알아 냈습니다.

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

어떻게 모든 괄호가 올까요?

+3

사용 '사용 경고, 펄 코드를 구문 분석하는 방법을 보여줍니다 ings;'(또는'-w') !!! – ikegami

답변

9

This thread은 두 가지 질문을 모두 다루고 있습니다 (print (-2) ** 32에 해당하는 부분을 찾으려면 조금씩 내려 가야합니다).

가 무엇인지 요약 : 첫 번째 문제 (perl -Mbignum=l -e "print -2 ** 32")에 대한

  • : 펄 지수는 단항 부정보다 더 높은 우선 순위를 가지고 있습니다에.
  • 두 번째 문제 (perl -Mbignum=l -e "print (-2) ** 32")의 경우 : 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 

나는 함수 응용 프로그램 (인수로 -2으로 호출되는 함수 printprint (-2)을 구문 분석)을 비트 것입니다 같아요. 당신이하려고하면

3

그것은의 bignum 관련 문제,이 아니에요 :

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

당신이 얻을 : -2

그래서 "문제는"인쇄 기능의 인수 형식입니다

2

당신은 변수와 상수를 대체 할 경우, B :: Deparse 그렇게

$ 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