perl,从哈希获取嵌套哈希

时间:2014-04-17 12:39:34

标签: perl

我不明白这个剧本有什么问题:

%Region = (1 => {name => "nameVal"}, 2 => {name => "nameVal2"});
while(my($k, %v) = each %Region) {  
    print $k, $v{'name'}, "\n"; 
}

它不会从嵌套哈希值中打印出来。

我尝试使用不同的逗号,没有效果。

perl v5.12.4,mac os

2 个答案:

答案 0 :(得分:3)

您的嵌套哈希值为hashref - 对哈希值的引用 - 因此您需要使用->取消引用来访问它。

%Region = (1 => {name => "nameVal"}, 2 => {name => "nameVal2"});
while(my($k, $v) = each %Region) {  
    print $k, $v->{'name'}, "\n"; 
}

这是hashref,因为您使用{ }来初始化嵌套哈希。

答案 1 :(得分:3)

始终在每个perl脚本的顶部包含use strict;use warnings;

use strict;
use warnings;

my %Region = (1 => {name => "nameVal"}, 2 => {name => "nameVal2"});
while(my($k, %v) = each %Region) {  
    print $k, $v{'name'}, "\n"; 
}

在这种情况下,警告可能如下:

Reference found where even-sized list expected at scratch.pl line 5.

这表明您正在将单个值(引用)分配给需要偶数大小的列表或键值对的散列%v

因此我们修复该行,以便为标量分配引用:

while(my($k, $v) = each %Region) {

现在您将收到以下错误:

Global symbol "%v" requires explicit package name at input7.pl line 6.

%v没有定义,只有我们带有引用的标量$v。要取消引用该变量并访问值,我们使用箭头运算符->

    print $k, $v->{'name'}, "\n"; 

输出现在是你想要的:

2nameVal2
1nameVal

此处的课程始终包含use strict;use warnings;在每个perl脚本的顶部。有关更多原因,请查看:Why use strict and warnings?