在perl中的子例程中声明全局变量

时间:2012-08-27 12:53:00

标签: xml perl anonymous-function subroutine

我想知道是否可以在Perl的子例程中声明一个全局变量,这样我就可以在钩子的void函数中使用该变量,但是通过在子例程中声明它来限制全局的破坏性影响。

因此子程序使用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是本地的,但对匿名子程序是可见的。

感谢您的时间,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

它应该已经按照您编写示例的方式工作了。您正在使用“my $func = sub { ... }”执行的操作是创建一个闭包,该闭包可以访问封闭范围的变量 - 在本例中为@elements

答案 1 :(得分:3)

my没问题。词法变量在嵌套作用域中可见,例如匿名子例程。

因此,您的代码应该按原样运行。

答案 2 :(得分:3)

您的代码应该正常工作

尽管匿名子程序很深,但它的范围包括词法数组@elements,它可以自由访问它

此外,子例程计为对数组的引用,因此当它在getRecipeIDs

的调用结束时超出范围时,不会对其进行垃圾回收