哈希可以有重复的键或值

时间:2011-05-25 02:23:45

标签: perl hash

哈希可以有重复的键或值吗?

6 个答案:

答案 0 :(得分:15)

它可以有重复的值而不是键。

答案 1 :(得分:9)

对于散列和数组,只能在给定键上存储一个标量。 (“键是唯一的。”)如果不是,你就做不到了

$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;

答案 2 :(得分:5)

假设谈论“%hash”

然后:

  • 不允许重复密钥。
  • 允许重复值。

这很容易理解,因为它是特定键到特定值的映射,其中Value在查找中不起作用,因此独立于其他价值观。

答案 3 :(得分:1)

您可以尝试使用CPAN中的Hash::MultiKey模块。

(我使用Data :: Dumper来显示哈希的外观 - 这里没有必要)

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'
        };

从技术上讲,Hash :: MultiKey允许您创建引用作为哈希键。

答案 4 :(得分:1)

请尝试运行此代码,它会毫无错误地执行。 我希望这就是你所要求的!

#!/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";

答案 5 :(得分:0)

是的哈希可以有重复的密钥,如下所示......

关键示例:BirthDate | LastNameFirst4Chars | FirstNameInitial | IncNbr                        " 1959年12月19日|威尔| K | 1" ......" 1959-12-19 |将| K | 74"。
       注意:如果有人不记得他们的社会保障Nbr

,这可能是记录查找的有用密钥
   #-- 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
       }
   }