【问题标题】:Iterate through an array of hashes of array in Perl?在Perl中遍历数组的哈希数组?
【发布时间】:2019-01-13 23:12:03
【问题描述】:

我在可视化循环时遇到了麻烦,并且我认为是数组的散列数组。如果我对此有误解,请纠正我。我希望能够遍历下面的数组并打印每个键的值。

最终结果会像这样打印元素:

name
version
pop
tart 

不幸的是,当我到达关键三时,我崩溃了。

my @complex = (
    [
        {
            one   => 'name',
            two   => 'version',
            three =>  [qw( pop tart )],
        },
    ],
);

这是我到目前为止所做的。我只是不知道在这些循环中处理关键三。

for my $aref (@complex) {
    for my $href (@$aref) {
        for (keys %{$href}) {
            print "$href->{$_}\n";
        }
    }
}

任何帮助将不胜感激。

【问题讨论】:

    标签: arrays perl loops hash


    【解决方案1】:

    似乎阻碍你的是你的哈希值有一些是字符串和一些是数组引用。您可以找出哪些使用ref,然后相应打印

    for my $aref (@complex) {
        for my $href (@$aref) {
            for my $key (keys %{$href}) {
                my $refval = ref $href->{$key};
                if (not $refval) {              # not a reference at all
                    print "$href->{$key}\n";
                } elsif ($refval eq 'ARRAY') {
                    print "$_\n" for @{ $href->{$key} };
                    #print "@{ $href->{$key} }\n";       # or all in one line
                } else {
                    warn "Unexpected data structure: $refval";  
                }
            }
        }
    }
    

    对于更深层次的结构,或者你不知道的结构,在此基础上编写一个递归过程。还有一些模块也可以做到这一点。

    请注意,仔细考虑要使用哪些数据结构会带来丰厚的回报;它是设计的关键部分之一。另一方面,一旦这些复杂的数据结构变得笨拙,或者更确切地说,如果您提前估计在项目的生命周期中可能会发生这种情况,答案就是切换到一个类。

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      相关资源
      最近更新 更多