2010-02-16 2 views

답변

2

당신은 경고를 얻을 것입니다. 첫 번째 $i은 실제로 어휘 변수가 아닙니다. 당신은 Devel::Peek을 사용하여이 증명할 수 :

use Devel::Peek; 

for my $i (1) { 
    Dump $i; 
} 

SV = IV(0x81178c8) at 0x8100bf8 
REFCNT = 2 
FLAGS = (IOK,READONLY,pIOK) 
IV = 1 

$imy로 선언 된 어휘 변수임을 나타냅니다 FLAGS에는 PADMY 플래그가 없습니다.

9

실제로 동일한 범위의 재정의에 대한 경고 만 표시됩니다. 글 :

use warnings; 
my $i; 
{ 
    my $i; 
    # do something to the inner $i 
} 
# do something to the outer $i 

은 완벽하게 유효합니다.

나는 펄 내부는 이런 식으로 처리하면 잘 모르겠지만, 당신은 때문에의,

{ 
    my $i; 
    for $i (...) { ... } 
    # the outer scope-block parens are important! 
};
+0

두 번째 예는 첫째로 모두 같은에서 아니므로 분석되는대로 for 루프 생각할 수 다른 범위와 루프 반복자가 배열 요소에 앨리어싱됩니다 (즉, 루프 내에서 $ i를 변경하면 배열을 변경하거나 요소가 상수이면 경고를 생성 함). – Ether

+0

두 블록 모두 for 블록의 동일한 범위 내에 있지만 예제는 서로 다른 범위에 있습니다. –

+0

두 번째 예제의 앨리어싱은 예상대로 작동하지만 직접 시도하십시오. my @a = (1 .. 3); {my $ i; $ i (1 .. 3) {$ i = 'x'; }} 인쇄 "a : @a"; 동일한 범위에서 : 질문과 마찬가지로, for 표현식의 선언은 내부 블록의 선언과 동일한 범위에 있지 않습니다. – willert

관련 문제