2010-08-01 13 views
35

Diciamo che definiamo un hash anonimo come questo:Come cancellare un hash Perl

my $hash = {}; 

e quindi utilizzare l'hash dopo. Quindi è il momento di svuotare o cancellare l'hash per il riutilizzo di . Dopo alcune ricerche di Google, ho trovato:

%{$hash} =() 

e:

undef %{$hash} 

Entrambi saranno servire i miei bisogni. Qual è la differenza tra i due? Sono entrambi modi identici per svuotare un hash?

risposta

23

Sì, sono assolutamente identici. Entrambi rimuovono qualsiasi chiave e valore esistente dalla tabella e imposta l'hash nella lista vuota.

Vedi perldoc -f undef:

undef espr
undef     non-definisce il valore di ESPR, che deve essere un valore assegnabile. Utilizzare solo su un valore scalare, un array (utilizzando "@"), un hash (utilizzando "%"), una subroutine (utilizzando "&") o un typeglob (utilizzando "*") ...
Esempi:

   undef $foo; 
       undef $bar{'blurfl'};  # Compare to: delete $bar{'blurfl'}; 
       undef @ary; 
       undef %hash; 

Tuttavia, non si dovrebbe usare undef per rimuovere il valore di nulla, tranne uno scalare. Per altri tipi di variabili, impostalo sulla versione "vuota" di quel tipo, ad es. per matrici o hash, @foo =(); %bar =();

+21

Sono quasi identici. dopo undef, definito restituirà false, dopo =(), definito è ancora vero. – rurban

+0

Penso che l'obiezione di Rurban a questa risposta sia piuttosto importante. Forse Ether potrebbe aggiornare la sua risposta per menzionare questa differenza? – antred

+3

L'uso del definito (% hash) è deprecato e non dovrebbe essere utilizzato. Quindi l'obiezione di Rurban potrebbe alla fine essere discutibile. Dai documenti perl per "definiti": "L'uso di definiti su aggregati (hash e matrici) è deprecato, utilizzato per segnalare se la memoria per quell'aggregato è mai stata allocata. Questo comportamento potrebbe scomparire nelle versioni future di Perl." – PhilHarvey

29

%$hash_ref =(); ha più senso che annullare l'hash. Undef l'hash dice che hai finito con l'hash. Assegnare una lista vuota dice che vuoi solo un hash vuoto.

Problemi correlati