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

Xml 在perl中的子例程中声明全局变量,xml,perl,anonymous-function,subroutine,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 =

我想知道是否有可能在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
是本地的,但对匿名子例程是可见的


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

我的
很好。词法变量在嵌套作用域中可见,例如匿名子例程


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

它应该已经按照您编写示例的方式工作了。您使用“
my$func=sub{…}
”所做的是创建一个可以访问封闭范围变量的闭包——在本例中,您的代码应该可以正常工作

尽管匿名子例程很深,但它的范围包括词法数组
@元素
,并且可以自由访问它

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