2014-02-06 2 views
0

고려 다음 코드 :액세스 중첩 된 해시 및 서브 루틴

#GLOBAL SPACE HERE 
{ 
    #NESTED HERE 
    my %hash = (
     key1 => 'A', 
     key2 => 'B', 
     key3 => 'C', 
     key4 => 'D', 
    ); 

    sub test 
    { 
     #subroutine code goes here 
    } 
} 

어떻게 해시 또는이 중괄호 내에 중첩 된 전역에서 서브 루틴 중 하나가 액세스 할 것인가?

답변

2

해시는 블록 (중괄호)에 어휘 적으로 범위가 지정되므로 해당 블록 내부에서만 액세스 할 수 있습니다. 서브 루틴은 범위에 관계없이 어디서나 액세스 할 수 있습니다.

+0

변수는 컴파일시에도 선언됩니다. 차이점은 서브 루틴은 어휘 적으로 범위가 지정되지 않는다는 것입니다. – ysth

+0

@ysth 런타임 실행이 선언 된 코드의 지점에 도달 할 때까지 변수에 액세스 할 수 없습니다. 서브 루틴은 범위에 관계없이 런타임에 코드의 모든 지점에서 사용할 수 있습니다. – TLP

+0

첫 번째 지점 인 no :'my $ x; BEGIN {엄격한 사용; $ x = 42} print $ x'. 당신의 두 번째 요점을 다시 말하자면, 그것은 "컴파일 타임에 선언 된대로"대신에 말해야한다고 말하는 것입니다. 후자는 문제가 아닙니다. – ysth