迭代哈希中的哈希数组

时间:2018-01-21 01:00:23

标签: arrays perl loops hash

我是Perl的新手,我很难在哈希中迭代哈希数组。我试过this solution这是Dumper的数据结构:

1234 => {  
        'items' => [
            #0 { 
                    'k1' => { 'x1' => '123', 'x2' => '321' }, 
                    'k2' => 'v2', 
                    'k3' => 'v3', 
                    'k4' => 'v4' 
                }, 
            #1 { 
                    'k1' => { 'x1' => '123', 'x2' => '321' }, 
                    'k2' => 'v2', 
                    'k3' => 'v3', 
                    'k4' => 'v4' 
                }, 
            #2 { 
                    'k1' => { 'x1' => '123', 'x2' => '321' }, 
                    'k2' => 'v2', 
                    'k3' => 'v3', 
                    'k4' => 'v4' 
                },
            ],
}

这是我的代码。我想迭代哈希'%myHash'同时可以访问键和值。然后对于"项目中的每个哈希"数组我想执行一些操作。

在这种情况下,我的密钥是' 1234'它的值是一个包含密钥'项目的哈希值。这是我的代码(散列的引用被传递给我的sub):

sub iterateHash {
    my %myHash = @_;

    while (my ($key, $value) = each %myHash) {
        my %newHash;
        foreach my $item (@{ $value->{'items'} }) {
            if( !(defined $newHash{'nk1'}) ) {
                $newHash{'nk1'} = $item{'k1'}{'x2'};
            }
        }
    }
}

以及如何调用它:

my $results = iterateHash(\%myHash);

我后来使用了密钥,这就是为什么我想在外部while循环中访问一对中的键和值,但是现在我想让这部分工作。

这是我得到的错误:

Global symbol "%item" requires explicit package name

1 个答案:

答案 0 :(得分:2)

您传递了引用但未将其视为iterateHash中的引用。此外,一旦进入嵌套结构,一切都是引用,因此$item是哈希引用而不是普通哈希。

sub iterateHash {
    my ($myHash) = @_;

    while (my ($key, $value) = each %$myHash) {
        my %newHash;
        foreach my $item (@{ $value->{'items'} }) {
            if( !(defined $newHash{'nk1'}) ) {
                $newHash{'nk1'} = $item->{'k1'}->{'x2'};
            }
        }
    }
}