哈希表可以有重复的值,但是键必须是唯一的。
它可以有重复的值,但不能有重复的键。
对于哈希和数组,每个键(key)只能存储一个标量(scalar)。("键(key)是唯一的")。如果不是这样,你将无法进行
$h{a} = 1;
$h{a} = 2;
$val = $h{a}; # 2
$a[4] = 1;
$a[4] = 2;
$val = $a[4]; # 2
如果你想将多个值与一个键关联起来,你可以在该键上放置对数组(或哈希)的引用,并将值添加到该数组(或哈希)中。for my $n (4,5,6,10) {
if ($n % 2) {
push @{ $nums{odd} }, $n;
} else {
push @{ $nums{even} }, $n;
}
}
say join ', ', @{ $nums{even} };
更多内容请参见perllol。
至于值,在哈希和数组中,多个元素可以具有相同的值。
$counts{a} = 3;
$counts{b} = 3;
$counts[5] = 3;
$counts[6] = 3;
假设我们谈论的是“%hash”。
那么:
这很容易理解,因为它将一个特定的键映射到一个特定的值,其中该值在查找中不起作用,因此独立于其他值。
#!/usr/bin/perl
use strict;
use warnings;
my %hash = ('a' => 1, 'a' => 2, 'b' => 4 );
print values %hash, "\n\n";
print keys %hash, "\n\n";
use Data::Dumper;
use Hash::MultiKey;
tie my %multi_hash, 'Hash::MultiKey';
$multi_hash{['foo', 'foo', 'baz']} = "some_data";
for (keys %multi_hash) {
print @$_,"\n";
};
print Dumper\%multi_hash;
foofoobaz
$VAR1 = {
'ARRAY(0x98b6978)' => 'some_data'
};
是的,哈希表可以有重复的键,就像我下面演示的那样...
键的例子:出生日期|姓氏前四个字符|名字首字母|编号
"1959-12-19|Will|K|1" ... "1959-12-19|Will|K|74"。
注意:如果有人忘记了他们的社会安全号码,这可能是一个有用的记录查找键。
#-- CODE SNIPPET:
@Offsets=(); #-- we will build an array of Flat File record "byte offsets" to random access
#-- for all records matching this ALT KEY with DUPS
for ($i=1; $i<=99; $i++) {
$KEY=$BirthDate . "|" . $LastNameFirst4Chars . "|" . $FirstNameInitial . "|" . $i;
if (exists $Hash{$KEY}) {
push @Offsets, $Hash{$KEY}; #-- add another hash VALUE to the end of the array
}
}
@Offsets
和%Hash
都没有改变(即仍为空)。该代码只是为变量$KEY
生成99个不同的值,例如blabla|1
,blabla|2
,... blabla|99
。 - PerlDuck"$BirthDate|...|1"
和"$BirthDate|...|2"
是不同的,对吧?所以这些键并不是重复的。 - PerlDuck