【问题标题】:XML::Twig Parse Hash to twig handler subXML::Twig Parse Hash to twig handler sub
【发布时间】: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 崩溃。

标签: xml perl xml-twig


【解决方案1】:

这个问题似乎有点误导。如果您得到:“%Hash_Vals 需要明确的包名称和变量 %Hash_Types 的相同错误。”

... 这意味着您还没有声明这些变量。与 XML::TwigXML 解析没有太大关系。

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

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{$tag1} 没有 联系。您可能想要$Hash_Vals -> {$tag1},但如果不知道%Hash_Vals 实际包含什么,就很难说清楚。

【讨论】:

  • 非常感谢 Sobrique。正如您所说,问题很简单,使用 $Hash_Vals -> {$tag1}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多