Может ли Hash иметь дубликаты ключей или значений - PullRequest
7 голосов
/ 25 мая 2011

Может ли Hash иметь дубликаты ключей или значений?

Ответы [ 6 ]

15 голосов
/ 25 мая 2011

может иметь повторяющиеся значения, но не ключи.

9 голосов
/ 25 мая 2011

Как для хэшей, так и для массивов на данном ключе может храниться только один скаляр. («Ключи являются уникальными.») Если бы они не были, вы не могли бы сделать

$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;
5 голосов
/ 25 мая 2011

Если говорить о «% хэше»

Тогда:

  • Повторяющиеся ключи не разрешены.
  • Допускаются повторяющиеся значения.

Это легко рассуждать, потому что это отображение конкретного ключа к конкретному значению, где значение не играет никакой роли в поиске и, таким образом, не зависит от другихЗначения.

1 голос
/ 10 июля 2014

Пожалуйста, попробуйте запустить этот код, он выполняется без ошибок. Я надеюсь, что это то, что вы спрашивали!

#!/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";
1 голос
/ 25 мая 2011

Вы можете попробовать использовать модуль Hash :: MultiKey из CPAN.

(я использовал 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 позволяет создавать ссылку в качестве хеш-ключа.

0 голосов
/ 28 июля 2017

Да, хэш может иметь дубликаты ключей, как я продемонстрирую ниже ...

Пример ключа: BirthDate | LastNameFirst4Chars | FirstNameInitial | IncNbr "1959-12-19 | Will | K | 1" ... "1959-12-19 | Will | K | 74".
Примечание: это может быть полезным ключом для поиска записей, если кто-то не помнит их Social Security 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
       }
   } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...