【问题标题】:Need to build a foreach statement from a hash array of variable elements in Perl需要从 Perl 中变量元素的哈希数组构建一个 foreach 语句
【发布时间】:2011-05-14 04:41:18
【问题描述】:

我在 Perl 中使用XML::Simple 来解析 XML 文件,但我一直在思考如何构建一个循环来遍历哈希中数组的所有可能元素。

这里是如何打印数组的第 0 个元素:

print $book_info->{BookList}->{BookData}->{Prices}->{Price}[0]->{is_new};

在使用哈希与数组这两个词时,我的术语可能不正确,但我正在尝试遍历 {Price}[$ref] 中的所有元素

我试过了:

my @refs = $book_info->{BookList}->{BookData}->{Prices}->{Price};
foreach(@refs)
{
    print $book_info->{BookList}->{BookData}->{Prices}->{Price}[$_]->{store_id};
    print "\n";
}


foreach my $key (keys (%{$book_info->{BookList}->{BookData}->{Prices}->{Price}}))
{
    print $key."\n";
}


下一个打印语句返回值"ARRAY(0x159a57c)"

   print [$book_info->{BookList}->{BookData}->{Prices}->{Price}];


这适用于 foreach,但我无法正确访问元素:
foreach (@{$book_info->{BookList}->{BookData}->{Prices}->{Price}})
{
    print $book_info->{BookList}->{BookData}->{Prices}->{Price}[$_]; #this line is wrong
}

有什么建议吗? {Prices} 元素中有多个{Price} 元素,每个{Price} 元素在XML 中都有[x] 属性。

【问题讨论】:

  • 我没有使用过 XML::Simple,但我认为 $book_info->{BookList}->{BookData}->{Prices}->{Price} 是数组引用,因此您需要像 @( $book_info->{BookList}->{BookData}->{Prices}->{Price}) 那样取消引用它。还包括您现在从脚本中获得的输出。
  • 我尝试了foreach (@($book_info->{BookList}->{BookData}->{Prices}->{Price})) 并得到了Scalar found where operator expected.....

标签: xml arrays perl hash foreach


【解决方案1】:

人们并不完全适合你。如果我理解正确,您希望:

foreach my $element ( @{ $book_info->{BookList}->{BookData}->{Prices}->{Price} } ) {
    print $element->{store_id};
    print "\n";
}

有关处理嵌套数据结构的有用建议,请访问http://perlmonks.org/?node=References+quick+reference

【讨论】:

  • 我尝试了同样的方法,但我想了解这些元素:print $book_info->{BookList}->{BookData}->{Prices}->{Price}[$element]; 我现在浏览那个网站
  • print $book_info->{BookList}->{BookData}->{Prices}->{Price}[$element]->{store_id};
  • 来自网站的#4:${$hRef->{KEY}}[1] $hRef->{KEY}->[1] $hRef->{KEY}[1] 看起来最接近我的情况,但不确定它如何适合
  • 直到现在我还没有完全理解你的答案......哈哈谢谢 - 行得通!
【解决方案2】:

稍微延长ysth的回答:

foreach my $elem_ref (@{$book_info->{BookList}->{BookData}->{Prices}->{Price}})
{
    foreach my $key (sort keys %{$elem_ref})
    {
        print $elem_ref->{$key};
    }
    print "\n";
}

这在某种程度上使用了 Perl Best Practices 的建议来表示带有后缀 _ref 的引用。

【讨论】:

    【解决方案3】:

    您是否尝试使用 Data::Dumper 转储 $book_info 的内容(使用 Data::Dumper; print Dumper($book_info)?它应该为您提供如何继续的线索。

    【讨论】:

    • 也许你可以在这里发布一个输出,以便我们看看。
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2019-07-30
    • 2021-06-24
    • 2016-04-15
    • 2011-04-20
    • 2010-09-14
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多