-1

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

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

所以我想要实现的是,当我尝试遍历数组 model->{add} 的哈希时

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

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

4

4 回答 4

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} } );
于 2013-03-07T11:54:09.607 回答
1

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

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";
}
于 2013-03-07T12:01:09.867 回答
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 ...

然而,如果你没有启用这两个 pragma,Perl 会很高兴地打印空字符串并对整个事情保持沉默。这使得错误很难被发现。

处理此问题的正确方法是从哈希中获取正确的标量值,并使用正确的符号取消引用它。如果你看关键'add'

'add'     =>  [

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

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

这与

my $adds = $model->{add};
print $_->{name} for @$adds;
于 2013-03-07T12:10:32.747 回答
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 } } ) );
于 2013-03-07T11:39:27.100 回答