2011-05-25 13 views

risposta

13

può avere valori duplicati ma non chiavi.

+2

Sto inoltrando un incarico basato sul tuo 14.5k rep haha, debitamente citato, ma se dovessimo probabilmente verrai a conoscenza del mio docente tra un po 'di tempo ... – lol

5

Supponendo parlando di un "hash%"

Poi:

  • chiavi duplicate non ammessi.
  • Valori duplicati consentiti.

Questo è facile ragionare su perché è una mappatura di un particolare chiave per un particolare valoredove il valore non svolge alcun ruolo nel look-up ed è quindi indipendente su altri valori.

9

Per entrambi gli hash e gli array, è possibile memorizzare solo uno scalare su una determinata chiave. ("Le chiavi sono uniche.") Se non lo fossero, non si poteva fare

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

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

Se si voleva associare più valori a una chiave, è possibile inserire un riferimento ad un array (o hash) a quella chiave e aggiungere il valore a tale array (o hash).

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

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

Vedere perllol per ulteriori informazioni.

Come per i valori, più elementi possono avere lo stesso valore in entrambi gli hash e gli array.

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

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

Si può provare a utilizzare il modulo Hash::MultiKey da CPAN.

(ho usato Data :: Dumper per mostrare come hash è esattamente sembra - non è necessario qui)

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; 

E l'uscita shoud essere():

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

Quindi tecnicamente parlando Hash :: MultiKey ti consente di creare un riferimento come chiave hash.

1

Si prega di provare ed eseguire questo codice, viene eseguito senza errori. Spero che questo sia quello che stavi chiedendo!

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

Sì un hash può avere chiavi duplicate, come dimostro qui di seguito ...

esempio chiave: Data di nascita | LastNameFirst4Chars | FirstNameInitial | IncNbr "1959/12/19 | Will | K | 1". .. "1959-12-19 | Will | K | 74".
Nota: Questa potrebbe essere una chiave utile per la registrazione look up se qualcuno non si ricordava loro Nbr sicurezza sociale

#-- 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

Cosa dimostra questo? Dopo che il codice è stato eseguito, sia '@ Offset' che'% Hash' sono invariati (vale a dire ancora vuoti). Il codice genera semplicemente 99 valori _differenti per la variabile '$ KEY', come' blabla | 1', 'blabla | 2', ...' blabla | 99'. – PerlDuck

+0

Ok, ma gli hash standard in Perl non possono sicuramente avere chiavi duplicate. Le chiavi del tuo esempio sono tutte diverse. '" $ BirthDate | ... | 1 "' è diverso da '" $ BirthDate | ... | 2 "', no? Quindi le chiavi sono _non_ duplicate. – PerlDuck

+0

PerlDuck, il numero di sequenza rende la chiave univoca. Se ho una chiave primaria unica, diciamo il numero di previdenza sociale. E voglio accedere a un record nel mio database, ma il SSN non viene ricordato, quindi posso usare un ALT KEY con DUPS come: "$ BirthDate | $ LastNameFirst4Chars | $ FirstNameInitial | SeqNbr". "1959-12-19 | Will | K | 1 ..." 1959-12-19 | Will | K | 99 ". Tutti i dati nel KEY sono duplicati tranne per il numero di sequenza. Ecco come abilitare un hash avere chiavi duplicate. –

Problemi correlati