Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在散列中的散列数组上迭代_Arrays_Perl_Loops_Hash - Fatal编程技术网

Arrays 在散列中的散列数组上迭代

Arrays 在散列中的散列数组上迭代,arrays,perl,loops,hash,Arrays,Perl,Loops,Hash,我是Perl新手,在散列中迭代散列数组很困难。我在这里尝试了Dumper的数据结构: 1234 => { 'items' => [ #0 { 'k1' => { 'x1' => '123', 'x2' => '321' }, 'k2' => 'v2', 'k3' => 'v3',

我是Perl新手,在散列中迭代散列数组很困难。我在这里尝试了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”。然后,对于“items”数组中的每个散列,我想执行一些操作

在本例中,我的键是“1234”,其值是包含键“items”的散列。这是我的代码(散列的一个引用正在传递给我的sub):

以及它的名称:

my $results = iterateHash(\%myHash);
稍后我会用到键,这就是为什么我希望在外部while循环中访问成对的键和值,但现在我想让这部分正常工作

这是我得到的错误:

Global symbol "%item" requires explicit package name

您传递了一个引用,但没有将其视为
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'};
            }
        }
    }
}

请说明如何调用它,包括如何定义
iterateHash
的参数。您传递的是实际哈希还是哈希引用?一旦进入嵌套结构,所有内容都是引用。@JimGarrison我在上面提到过,我正在将引用传递给这个子对象。在上面添加了调用。啊,好的。所以我没有取消引用我传入的哈希来访问值或嵌套项?谢谢你说的对。我个人发现在任何地方使用引用都要容易得多,因为在嵌套数据结构中使用的就是引用。我从未(几乎从未)使用过普通散列。如果我使用“%$myHash”,则会出现以下错误:“不能使用字符串(“1”)作为散列引用,而使用“严格引用”“.哎呀。。。我的代码中有个小错误,我会改正的。忘记了第一条语句中
$myHash
周围的括号。请提供列表上下文,以便将
@
的第一个元素分配给
$myHash
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'};
            }
        }
    }
}