2010-02-23 2 views
9

dire che ho avuto qualcosa di simile:Come posso creare un nuovo riferimento hash vuoto in Perl?

# %superhash is some predefined hash with more than 0 keys; 
%hash =(); 
foreach my $key (keys %superhash){ 
    $superhash{ $key } = %hash; 
    %hash =(); 
} 

avrebbe tutte le chiavi del punto superhash per lo stesso hash vuoto accede da %hash o Sarebbero diverse hash vuoti?

In caso contrario, come posso assicurarmi che puntino agli hash vuoti?

+0

@toolic mi scuso. Il codice effettivo che avevo era un po 'troppo complicato da postare, quindi l'ho riscritto per la domanda. –

risposta

16

È necessario utilizzare l'operatore \ per fare riferimento a un tipo di dati plurale (array o hash) prima di poterlo memorizzare in un singolo slot di entrambi. Ma nel codice di esempio dato, se riferito, ognuno sarebbe lo stesso hash.

Il modo per inizializzare la struttura dei dati è:

foreach my $key (keys %superhash) { 
    $superhash{ $key } = {}; # New empty hash reference 
} 

Ma l'inizializzazione come questo è in gran parte inutile nella Perl causa autovivificazione (creazione di oggetti contenitori appropriati quando una variabile viene utilizzata come contenitore).

my %hash; 

$hash{a}{b} = 1; 

Ora %hash ha una chiave, 'a', che ha un valore di un rifhash anonima, contenente la coppia chiave/valore b => 1. Gli array si autovivificano allo stesso modo.

+0

concordato. Non è necessario portare un hash extra intorno a quando Perl non ne ha bisogno. – Zaid

+0

Come potrei accedere alle chiavi di $ hash {a}? Quando provo 'foreach my $ rk (keys $ hash {a}) {...' mi dà un errore: il tipo deve essere hash –

+0

Ah ho capito: '$ deref = $ hash {a}' e poi 'foreach $ key (keys% $ deref) {...' –