Arrays Perl-通过方括号遍历哈希数组
我有一个散列,其键是字符串,键是数组(复杂的是数组是在方括号中定义的),所以我的散列如下Arrays Perl-通过方括号遍历哈希数组,arrays,perl,hash,Arrays,Perl,Hash,我有一个散列,其键是字符串,键是数组(复杂的是数组是在方括号中定义的),所以我的散列如下 model = { 'add' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ], 'remove
model = {
'add' => [
{'name' => 'abc1', 'value' => 'def' },
{'name' => 'abc2', value => 'ghi'}
],
'remove' => [
{'name' => 'abc1', 'value' => 'def' },
{'name' => 'abc2', value => 'ghi'}
]
};
所以我要做的是,当我尝试遍历数组的散列时
模型->{add}as
print $_->{name} foreach(model->{add})
它不起作用。
我猜这是因为数组位于[]而不是()。
考虑到输入不能更改。请让我知道如何度过这一关…首先使用
严格使用;使用警告代码>
标量模型
应写成
my $model = { 'add' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ], 'remove' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ] };
及
您有一个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";
}
声明:
print $_->{name} foreach(model->{add})
不起作用,因为模型
是一个空话,而不是一个变量。如果代码中有这两个pragma:
use strict;
use 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 ...
Can't use bareword ("model") as a HASH ref while "strict refs" in use at ...
而strict
将告诉您:
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 ...
Can't use bareword ("model") as a HASH ref while "strict refs" in use at ...
但是,如果您没有启用这两个pragma,Perl将很高兴地打印空字符串,并对整个过程保持沉默。这使得错误很难被发现
正确的处理方法是从散列中获取正确的标量值,并使用正确的符号解除对它的引用。如果查看键“添加”
:
'add' => [
您将看到它存储了一个数组引用,这意味着要使用的信号是@
。您需要使用大括号来消除引用的歧义。此外,还必须将变量称为$model
print $_->{name} for @{ $model->{add} };
这和
my $adds = $model->{add};
print $_->{name} for @$adds;
DoesNot work错误:在ab.pl第9行不推荐使用伪哈希。在ab.pl第9行使用“strict refs”时,不能将字符串(“value”)用作散列引用。@user1737619已编辑,现在检查是否有任何方法可以在不进行迭代的情况下获取数组中键“name”的值?@user1737619否。数组中的每个元素都需要单独访问,因此需要迭代。您可以直接访问该元素,例如,
$model->{add}[0]{name}
。但这只会得到数组中第一项的值。如果数组中只能有2个元素,则可以对第二个元素执行相同的操作,$model->{add}[1]{name}
。但是,如果还有更多,您可能需要迭代。总的来说,我还是建议进行迭代。一个很好的开始就是用一些简单的规则来解释如何处理数据结构。