Xml 细枝解析散列到细枝处理程序子

Xml 细枝解析散列到细枝处理程序子,xml,perl,xml-twig,Xml,Perl,Xml Twig,嗨 我有以下XML::Twig代码来打印一些标记信息。但是,我需要解析散列,而不是将数组解析为细枝处理程序子对象。 my $twig = XML::Twig->new( pretty_print => 'indented', twig_handlers =>{'tag1'=>sub{Modify_tag1_data(@_,\@Array_Vals,\@Array_Types)}}); sub Modify_tag1_data{ my ( $t

我有以下XML::Twig代码来打印一些标记信息。但是,我需要解析散列,而不是将数组解析为细枝处理程序子对象。

my $twig = XML::Twig->new(
    pretty_print => 'indented',
    twig_handlers =>{'tag1'=>sub{Modify_tag1_data(@_,\@Array_Vals,\@Array_Types)}}); 


sub Modify_tag1_data{
    my ( $twig, $tag1,$Array_Vals,$Array_Types) = @_;
    #
    $tag1 = $_->att('f');
    if($Array_Vals[$tag1] eq 'f' && $Array_Types[$tag1] eq 'test'){
        print $tag1 . "\n";
    }
}

但是,下面的代码(现在包含散列而不是数组)给出了一个错误,即symbo%Hash_Vals需要显式的包名,并且变量%Hash_Types也出现了相同的错误

my $twig = XML::Twig->new(
    pretty_print => 'indented',
    twig_handlers =>{'tag1'=>sub{Modify_tag1_data(@_,\%Hash_Vals,\%Hash_Types)}}); 


sub Modify_tag1_data{
    my ( $twig, $tag1,$Hash_Vals,$Hash_Types) = @_;
    #
    $tag1 = $_->att('f');
    if($Hash_Vals{$tag1} eq 'f' && $Hash_Types{$tag1} eq 'test'){
        print $tag1 . "\n";
    }
}

怎么了?

这个问题似乎有点误导。如果您得到:“%Hash\u Vals需要显式的包名,变量%Hash\u Types也会出现相同的错误。”

。。。这意味着您尚未声明这些变量。这与
XML::Twig
XML
解析没有多大关系

在你的潜艇里,你也在做一些奇怪的事情——我怀疑你没有做你想做的事情:

sub Modify_tag1_data{
    my ( $twig, $tag1,$Hash_Vals,$Hash_Types) = @_;
    #
    $tag1 = $_->att('f');
    if($Hash_Vals{$tag1} eq 'f' && $Hash_Types{$tag1} eq 'test'){
        print $tag1 . "\n";
    }
}

因为参数中的
$Hash\u Vals
除了看起来相似之外,与
$Hash\u Vals{$tag1}
没有任何联系。您可能想要
$Hash\u Vals->{$tag1}
,但如果不知道
%Hash\u Vals
实际上包含什么,就很难判断

“%Hash\u Vals需要显式包名”表示您没有正确声明
%Hash\u Vals
。但是我们看不到您在哪里声明它,因为您只发布了一个片段。此外,在您的子系统中,
$Hash\u Vals
$Hash\u Vals{$tag1}
无关。我还建议-除非您确实需要,否则不要使用
细枝处理程序。如果要传递带有参数的anon-sub,可能最好只解析整个过程,然后再修改它。不幸的是,我必须使用较旧版本的perl,如果在xml文件变大时尝试同时加载所有细枝结构,就会崩溃。非常感谢Sobrique。正如您所说,问题很简单,就是使用$Hash_Vals->{$tag1}