我有一个哈希,其键是一个字符串,键是数组(复杂的是数组在方括号中定义),所以我的哈希是这样的..
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})
它不起作用。 我想这是因为数组在[]而不是()。 考虑到输入无法改变。请让我知道如何通过这个......
答案 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 } } ) );