让我们改变的@new
演示显示是怎么回事:
my @new = qw/
attribute Mandatory
attribute Mandatory
max 994048685
max 9940486857
max F
min 0
min 0X00
min 0X00
name Protocol_discriminator
name Security_header
type nibble
value 7
value 778
value 778
/;
Perl的哈希键是唯一的,所以分配到@new
时%hash
,对于给定键的最后一个值“获胜。”举个简单的例子
$ perl -le '%h = qw/1 a 1 b 1 c/; print $h{1}'
c
既然你有相同的密钥多个值,使用一个数据结构,可以处理:
my %hash;
for (my $i = 0; $i < @new; $i += 2) {
my($name,$val) = @new[$i,$i+1];
push @{ $hash{$name} } => $val;
}
如果你不介意的破坏@new
,代码可以多一点惯用:
while (@new) {
my($name,$val) = splice @new, 0, 2;
push @{ $hash{$name} } => $val;
}
这意味着与给定的键在%hash
相关联的每个值是一个参考转换为值的数组。 push
运算符需要一个数组而不是引用,所以我们使用@{ ... }
来解引用它。
如果您不熟悉Perl参考资料,请务必阅读perlref和perllol文档。打印在%hash
值
的一种方式是
foreach my $name (sort keys %hash) {
print "$name = [@{ $hash{$name} }]\n";
}
输出:
attribute = [Mandatory Mandatory]
max = [994048685 9940486857 F]
min = [0 0X00 0X00]
name = [Protocol_discriminator Security_header]
type = [nibble]
value = [7 778 778]
用于打印和调试复杂的数据结构的另一种方便的技巧是Data::Dumper
模块:
use Data::Dumper;
print Dumper \%hash;
打印
$VAR1 = {
'attribute' => [
'Mandatory',
'Mandatory'
],
'value' => [
'7',
'778',
'778'
],
'min' => [
'0',
'0X00',
'0X00'
],
'name' => [
'Protocol_discriminator',
'Security_header'
],
'max' => [
'994048685',
'9940486857',
'F'
],
'type' => [
'nibble'
]
};
的问题是,有两组数据,与一个'name',后者覆盖前者开始。你希望你的散列与他们做什么?他们应该成为两个subhashes? – MvanGeest 2010-08-07 09:45:40
看看perldsc(1) – ninjalj 2010-08-07 22:03:12