2014-12-06 2 views
0

서브 루틴을 선언 한 후 my을 사용하여 어휘 적으로 변수를 선언하려고하면 Perl에서이 서브 루틴에이 변수가 표시되지 않습니다. 모두 서브 루틴이 변수를 볼 수 있습니다, 당신이 그것을 (@arr = (1,2,3);)를 선언하지 않고 변수를 설정하면, 그러나서브 루틴을 정의한 후 어휘 변수를 정의하십시오.

sub lol { 
    if (@arr) { 
     print "defined\n"; 
    } else { 
     print "not defined\n"; 
    } 
} 
my @arr = (1,2,3); 
sub lol2 { 
    if (@arr) { 
     print "defined\n"; 
    } else { 
     print "not defined\n"; 
    } 
} 
lol; #prints "not defined" 
lol2; #prints "defined" 

또는 our으로 변수를 선언 그러나, 서브 루틴은 변수가 변수가 표시됩니다 후에 선언했다.

버그 또는 기능인가요?

+0

이 부분은 다음과 같습니다. "그러나 변수를 변수로 설정하면 선언하면 [...] 선언은 이해하기 어렵습니다. – asjo

+0

@asjo 오, 통보하지 않았다, 미안, 바로 수정했다 – Vantuz

+1

시원하고 훨씬 이해하기 쉽다. "엄격한 사용; 경고 사용"; 변수를 사용하기 전에 모든 변수를 선언해야하기 때문에 실수를 피하기 쉽습니다. 의도 한대로 작동합니다. – asjo

답변

1

my으로 정의되지 않은 모든 변수는 암시 적으로 our (전역/패키지) 변수입니다. 그래서 그것은 하나의 특징입니다. use strict; pragma는 변수 선언에 our 또는 my을 명시 적으로 사용하도록합니다.

perldoc

엄격한 바르

당신은 어느 쪽도 명시 적으로 내 중 하나를 사용하여 (선언되지 않은 변수에 액세스하는 경우이 컴파일 타임에 오류가 발생, 인용, 더 정확하게하려면 우리 , 주 (state), 또는 바르 (vars) 사용). 변수 자살 문제와 미묘한 동적 범위 지정 문제를 피하기 위해 로컬 변수만으로는 충분하지 않습니다.

+0

하지만이 두 서브 루틴과 배열은 동일한 범위 내에서 선언됩니다. 맞습니까? – Vantuz

+0

'strict'는'our' 또는'my'를 사용하도록 강요하지 않습니다. 명시 적 패키지 이름을 지정해야합니다. 변수가'our' 또는'my'를 사용하여 현재 범위에서 선언되지 않는 한. 'main :: x = 0; '' – TLP

+0

@mpapec 서브 루틴은 범위를 상속 받습니까? 서브 루틴과 배열 모두 동일한 범위에서 정의되므로 배열은 두 서브 루틴 모두에서 볼 수 있어야합니다. 나는 아직도 하나의 서브 루틴에서만 볼 수있는 이유를 이해하지 못합니다. – Vantuz

관련 문제