2011-05-25 2 views

Odpowiedz

13

może zawierać zduplikowane wartości, ale nie klucze.

+2

Przesyłam zlecenie na podstawie twojego 14.5 tys. Powt. Haha, należycie cytowane, ale jeśli tak, prawdopodobnie za chwilę usłyszysz od mojego wykładowcy ... – lol

5

Zakładając mówić o "% hash"

wówczas:

  • zduplikowane klucze nie są dozwolone.
  • Możliwe wartości duplikatów.

Łatwo to rozumieć o ponieważ jest odwzorowaniem z szczególności kluczem do szczególności Wartość gdzie wartość nie odgrywa żadnej roli w look-up, a tym samym jest niezależny od innych wartości.

9

Dla obu skrótów i tablic tylko jeden skalar może być przechowywany pod danym kluczem. („Klucze są wyjątkowe”). Jeśli one nie były, nie można zrobić

$h{a} = 1; 
$h{a} = 2; 
$val = $h{a}; # 2 

$a[4] = 1; 
$a[4] = 2; 
$val = $a[4]; # 2 

Jeśli chcesz przypisać wiele wartości klucza, można złożyć odwołanie do tablicy (lub hash) na ten klucz i dodaj wartość do tej tablicy (lub hash).

for my $n (4,5,6,10) { 
    if ($n % 2) { 
     push @{ $nums{odd} }, $n; 
    } else { 
     push @{ $nums{even} }, $n; 
    } 
} 

say join ', ', @{ $nums{even} }; 

Aby uzyskać więcej informacji, zobacz perllol.

Jeśli chodzi o wartości, wiele elementów może mieć tę samą wartość zarówno w hasłach, jak i tablicach.

$counts{a} = 3; 
$counts{b} = 3; 

$counts[5] = 3; 
$counts[6] = 3; 
1

Możesz spróbować użyć modułu Hash::MultiKey z CPAN.

(użyłem Dane :: Dumper, aby pokazać jak to dokładnie wygląda hash - nie ma potrzeby tutaj)

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; 

a wyjście shoud być():

foofoobaz 
$VAR1 = { 
      'ARRAY(0x98b6978)' => 'some_data' 
     }; 

więc technicznie rzecz biorąc Hash :: MultiKey pozwala ci tworzyć referencje jako klucz skrótu.

1

Spróbuj uruchomić ten kod, uruchamia się bez błędów. Mam nadzieję, że właśnie o to prosiliście!

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

Tak hash może mieć duplikaty kluczy jak wykazać poniżej ...

Kluczowym przykładem: Data urodzenia | LastNameFirst4Chars | FirstNameInitial | IncNbr "19.12.1959 | Will | K | 1". .. "1959-12-19 | Will | K | 74".
Uwaga: Może to być użyteczne dla upy Key rekord wygląd jeśli ktoś nie pamięta ich 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 
     } 
    } 
+0

Co to pokazuje? Po uruchomieniu kodu zarówno '@ Offsets' i'% Hash' pozostają niezmienione (tzn. Nadal puste). Kod po prostu generuje 99 _różnych_ wartości dla zmiennej '$ KEY', takich jak' blabla | 1', 'blabla | 2', ...' blabla | 99'. – PerlDuck

+0

OK, ale standardowe skróty w Perlu na pewno nie mogą mieć duplikatów kluczy. Klucze z twojego przykładu są różne. '" $ BirthDate | ... | 1 "' różni się od '" $ BirthDate | ... | 2 "', czyż nie? Więc klucze nie są _ duplikowane. – PerlDuck

+0

PerlDuck, numer kolejny czyni klucz unikalnym. Jeśli mam unikalny klucz podstawowy, powiedzmy numer ubezpieczenia społecznego. Chcę uzyskać dostęp do rekordu w mojej bazie danych, ale SSN nie jest pamiętany, wtedy mogę użyć klawisza ALT w/DUPS, takiego jak: "$ BirthDate | $ LastNameFirst4Chars | $ FirstNameInitial | SeqNbr". "1959-12-19 | Will | K | 1 ..." 1959-12-19 | Will | K | 99 "Wszystkie dane w kluczu są duplikowane z wyjątkiem sekwencji nbr. W ten sposób włączasz haszowanie mieć zduplikowane klucze. –