我不明白这个剧本有什么问题:
%Region = (1 => {name => "nameVal"}, 2 => {name => "nameVal2"});
while(my($k, %v) = each %Region) {
print $k, $v{'name'}, "\n";
}
它不会从嵌套哈希值中打印出来。
我尝试使用不同的逗号,没有效果。
perl v5.12.4,mac os
答案 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?