在Perl中遍历数组的哈希数组?

时间:2018-08-06 23:46:16

标签: arrays perl loops hash

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

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

wx.Control.__init__

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

name
version
pop
tart 

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

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

似乎让您望而却步的是,您的哈希值包含一些值为字符串的值和某些值为数组引用的值。您可以使用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";  
            }
        }
    }
}

对于更深的结构或您不知道的结构,请基于此编写递归过程。然后还有一些模块可以做到这一点。

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