2012-10-06 4 views
3

나는 다음과 같은 작은 펄 (V5.10) 프로그램이 있습니다이 테스트 실행의 결과입니다Perl에서 print 명령의 산술 계산에 plus 연산자를 사용하는 방법은 무엇입니까?

use strict; 

my @nums; 
my $i = 0; 

while ($i < 5) { 

    print "Enter number " . $i+1 . ": "; 
    $nums[$i] = <STDIN>; 
    $i++; 
} 

foreach (@nums) { 

    chomp $_; 
    print "$_\t"; 
} 
print "\n"; 

:

1: 2 
1: 1 
1: 6 
1: 3 
1: 2 
2 1 6 3 2 

문제는, 당신이 볼 수 있듯이를 인쇄한다는 것입니다 사용자에게 입력을 요구하는 문이 예상대로 작동하지 않습니다. "Enter number 1 :"또는 "Enter number 3 :", e.t.c, 대신 "1 :"을 얻습니다. 나는 + 연산자가 Perl에서 문자열 연결을 위해 오버로드되었음을 알고 있기 때문에 이것이 정직하게 작동 할 것이라고 기대하지는 않았다. 이 문제를 어떻게 해결할 수 있습니까? 그리고 그 이유는 무엇입니까?

답변

8

+은 오버로드되지 않습니다. 우선 순위 문제입니다. 표현 당신은 펄 스크립트를 구문 분석하는 방식을 볼 수

perl -MO=Deparse,-p -e 'print "Enter number " . $i+1 . ": ";' 

을 사용할 수 있습니다

print((0 + 1) . ': '); 

과 동일

print(((('Enter number ' . $i) + 1) . ': ')); 

로 분석된다.

괄호를 추가하면 문제가 해결됩니다.

5

즉각적인 문제는 연산자 우선 순위를 잘못 가정하는 것이지만 흥미로운 또 다른 두 가지 (잠재적 인) 문제가 있음을 알 수 있습니다.

첫째, '출력'색인을 1에서 시작하고 5로 끝낼 수는 있지만 push을 사용하여 배열을 채우는 것은 거의 $i + 1을 사용하면 이해가되지 않습니다.

둘째, 그것은 (당신이 시도로 그렇지, 사용자로부터 번호를 수집?) 조금 이상한 사실은 입력 단계에서 수행해야 스크립트의 출력 단계에서 chomp을보고입니다

예 :

use warnings; use strict; 

my @numbers; 
for my $i (1..5) { 
    print "Enter number $i: "; 
    chomp(my $number = <STDIN>); 
    push @numbers, $number; 
} 

print "$_\t" for @numbers; 
print "\n"; 
관련 문제