2

我想知道是否可以在 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但对匿名子例程是可见的。

感谢您的宝贵时间,非常感谢您的帮助。

4

3 回答 3

6

它应该已经按照您编写示例的方式工作。你用“ my $func = sub { ... }”做的是你创建一个可以访问封闭范围变量的闭包——在这种情况下@elements

于 2012-08-27T12:56:40.843 回答
4

您的代码应该可以正常工作

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

此外,子例程算作对数组的引用,因此当它在调用结束时超出范围时不会被垃圾收集getRecipeIDs

于 2012-08-27T13:01:10.337 回答
3

my很好。词法变量在嵌套范围内可见,例如匿名子例程。

因此,您的代码应该按原样工作。

于 2012-08-27T12:56:02.173 回答