【发布时间】:2018-08-31 14:54:12
【问题描述】:
嗨,
我有以下 XML::Twig 代码来打印一些标签信息。但是,我不需要将数组解析到 twig 处理程序 sub,而是需要解析哈希。
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";
}
}
但是,下面的代码现在包含哈希而不是数组,给出了一个错误,提示符号 %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_Vals 需要明确的包名”表示您没有正确声明
%Hash_Vals。但是我们看不到你在哪里声明它,因为你只发布了一个 sn-p。同样在您的子中 -$Hash_Vals与$Hash_Vals{$tag1}无关。 -
我还建议 - 除非你真的需要,否则不要使用
twig_handlers。如果您要传递带有参数的匿名子程序,那么可能最好只解析整个内容,然后再对其进行修改。 -
不幸的是,如果我尝试在 xml 文件变大时一次加载所有 twig 结构,我必须使用旧版本的 perl 崩溃。