2012-08-27 59 views
1

我想知道是否可以在Perl的子例程中聲明一個全局變量,以便我可以在掛鉤的void函數中使用該變量,但通過限制全局的破壞性影響它在一個子程序中聲明。在perl中的子例程中聲明全局變量

所以子程序使用XML::Parser收集一堆元素的ID,以類似的方式:

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; 
} 

我也是在我的腳本中使用strict

所以我想宣佈@elements這樣一種方式,它在getRecipeIDs本地,但匿名子例程可見。

感謝您的時間,任何幫助,非常感謝。

+1

請參閱'perldoc -f local' – shawnhcorey

回答

5

它應該已經按照您編寫示例的方式工作。你在做什麼「my $func = sub { ... }」是你創建一個可以訪問封閉範圍的變量的閉包 - 在這個例子中是@elements

3

my很好。詞法變量在嵌套作用域中可見,例如匿名子程序。

因此,您的代碼應該按原樣工作。

3

您的代碼應該可以正常工作,因爲它代表

儘管匿名子程序的深度,其範圍包括詞法陣列@elements,它可以訪問它自由

而且子程序算作給一個參考數組,所以當它在通話結束時超出範圍時不會被垃圾收集到getRecipeIDs