首页 > 解决方案 > 在 Perl 中遍历数组的哈希数组?

问题描述

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

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

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";
        }
    }
}

任何帮助,将不胜感激。

标签: arraysperlloopshash

解决方案


似乎阻碍你的是你的哈希有一些值是字符串和一些是数组引用。您可以找出哪些是使用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";  
            }
        }
    }
}

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

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


推荐阅读