Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 Perl-通过方括号遍历哈希数组_Arrays_Perl_Hash - Fatal编程技术网

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}
。但是,如果还有更多,您可能需要迭代。总的来说,我还是建议进行迭代。一个很好的开始就是用一些简单的规则来解释如何处理数据结构。