Perl-迭代一系列带方括号的哈希值

时间:2013-03-07 11:32:02

标签: arrays perl hash

我有一个哈希,其键是一个字符串,键是数组(复杂的是数组在方括号中定义),所以我的哈希是这样的..

model = {
       'add'     =>  [
                      {'name' => 'abc1', 'value' => 'def' },
                      {'name' => 'abc2', value => 'ghi'} 
                     ],
       'remove'  =>  [
                       {'name' => 'abc1', 'value' => 'def' },
                       {'name' => 'abc2', value => 'ghi'}
                     ]
     };

所以我想要实现的是当我尝试迭代数组的哈希时 model-> {add} as

print $_->{name} foreach(model->{add})

它不起作用。 我想这是因为数组在[]而不是()。 考虑到输入无法改变。请让我知道如何通过这个......

4 个答案:

答案 0 :(得分:2)

$model = { 'add' => [ {'name' => 'abc1', 'value' => 'def' },
                  {'name' => 'abc2', 'value' => 'ghi'} ],
       'remove' => [ {'name' => 'abc1', 'value' => 'def' },
                     {'name' => 'abc2', 'value' => 'ghi'} ] };

print $_->{name} foreach( @{ $model->{add} } );

答案 1 :(得分:1)

你有一个3级嵌套结构:包含包含HashRefs的ArrayRefs的HashRef。

my $model = { 
    'add' => [ 
        {
            'name' => 'abc1', 
            'value' => 'def' 
        }, {
            'name' => 'abc2', 
            value => 'ghi'
        } 
    ], 
    'remove' => [ 
        {
            'name' => 'abc1', 
            'value' => 'def' 
        }, {
            'name' => 'abc2', 
            value => 'ghi'
        } 
    ] 
};

要访问这些嵌套数组和哈希值,您需要取消引用它们,方法是在它前面添加%@,具体取决于它是散列还是数组。

my $arrayref = $model->{add};

foreach my $hashref (@$arrayref) {
    print $hashref->{name}, "\n";
}

答案 2 :(得分:1)

声明:

print $_->{name} foreach(model->{add})

不起作用,因为model是一个单词,而不是一个变量。如果您的代码中包含以下两个编译指示:

use strict;
use warnings;

你将无法犯这样的错误。 warnings会告诉您:

Unquoted string "model" may clash with future reserved word at ...
Name "main::model" used only once: possible typo at ...
Use of uninitialized value in print at ...

strict会告诉你:

Can't use bareword ("model") as a HASH ref while "strict refs" in use at ...

但是,如果你没有启用这两个编译指示,Perl会愉快地打印空字符串并对整个事情保持沉默。这使得这个错误很难被发现。

处理此问题的正确方法是从哈希中获取正确的标量值,并使用正确的sigil取消引用它。如果您查看密钥'add'

'add'     =>  [

你会看到它中存储了一个数组引用,这意味着要使用的sigil是@。您需要支持花括号来消除引用的歧义。此外,您必须将变量称为$model

print $_->{name} for @{ $model->{add} };

相同
my $adds = $model->{add};
print $_->{name} for @$adds;

答案 3 :(得分:0)

首先使用use strict; use warnings;

标量model应写为

my $model = { 'add' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ], 'remove' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ] };

print $_->{name} foreach( ( @{ $model->{ add } } ) );