2012-08-27 4 views
1

전역 변수를 Perl의 서브 루틴 내에서 선언 할 수 있는지 궁금해서 그 변수를 후킹 된 void 함수에서 사용할 수 있지만, 그것은 서브 루틴에서 선언했습니다.perl의 서브 루틴에서 전역 변수 선언하기

그래서 서브 루틴은 유사한 방식으로, 요소의 무리의 ID를 수집 XML::Parser 사용 : 나는 또한 내 스크립트에 strict을 사용하고

sub getRecipeIDs { 
    my $recipe = shift; 
    my @elements =(); 

    my $parser = new XML::Parser(Style => 'Tree', 
     Handlers => { 
      Start => sub { 
       my ($expat, $element, %attrs) = @_; 
       if ($element eq 'recipe') { 
        push @elements, $attrs{id}; 
       } 
     }}); 

    $parser->parse($recipe); 

    return @elements; 
} 

.

따라서 @elements을 로컬로 getRecipeIDs에 국한되지만 익명 서브 루틴에서 볼 수 있도록 선언하고 싶습니다.

감사합니다. 도움을 주시면 감사하겠습니다.

+1

'perldoc -f local'을 참조하십시오. – shawnhcorey

답변

5

이미 예제를 작성한 방식으로 작동해야합니다. "my $func = sub { ... }"을 사용하여 수행하는 작업은 엔 클로징 범위의 변수에 액세스 할 수있는 클로저를 만듭니다 (이 경우 @elements).

3

my입니다. 어휘 변수는 익명 서브 루틴과 같이 중첩 된 범위에서 볼 수 있습니다.

따라서 코드는있는 그대로 작동해야합니다.

3

는 익명 서브 루틴의 깊이에도 불구

약자로 코드는 잘 작동해야으로, 그 범위는 자구 배열 @elements 포함 하고는 참조로서 그것을 자유롭게

또한 서브 루틴 카운트를 액세스 할 배열을 사용하기 때문에 호출이 끝날 때 범위를 벗어날 때 가비지 수집되지 않습니다.