讓我們改變的@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