2014-11-11 12 views
6

Ho questi due frammenti di codice che apparentemente dovrebbero produrre lo stesso risultato, ma quest'ultimo causa un errore.Errore mancante per il valore non definito come riferimento hash

1:

my $href = undef; 
my @values = values %{ $href }; 
# OK - @values is empty 

2:

my $href = undef; 
my %hash = %{ $href }; # <-- Error here 
my @values = values %hash; 
# ERROR: Can't use an undefined value as a HASH reference 

Perché non avendo values nella stessa linea permette di lavorare? Preferirei che entrambi commettessero un errore, poiché l'utilizzo di un valore non definito come riferimento hash è chiaramente un errore. Non ho più versioni recenti di perl da testare, ma questo era riproducibile in 5.8.8 e 5.10.1.

+1

Penso che [questa domanda SO simile] (http://stackoverflow.com/q/6419618) sui riferimenti di array si applichi anche qui. Ikegami dice "Le autorizzazioni si autoviviano nel contesto di lvalue (nel senso che è previsto un valore modificabile)." 'Perldoc -f values' dice" Nota che i valori non vengono copiati, il che significa che modificarli modificherà il contenuto dell'hash. " – ThisSuitIsBlackNot

+0

http://www.perlarchive.com/___TLC/7026.shtml http://stackoverflow.com/questions/1643717/why-does-an-undef-value-become-a-valid-array-reference-in- perl – chilemagic

+0

Se questo fosse correlato all'autovivificazione, mi aspetterei che "nessuna autovivificazione" causi un errore nel primo frammento. Non è così. – AKHolland

risposta

-1

Valori è una funzione e accetta un hash, un array o un'espressione generica come argomento (come indicato here). Se si passa undef come argomento a "valori", esso semplicemente lo rileva come vuoto e non restituisce alcun valore. D'altra parte, se provi a convertire in modo esplicito undef in un hash, fallirà, perché manca la coppia chiave-valore.

MODIFICA: Tanto per essere precisi. Questo errore si verifica con la direttiva "strict" (che dovresti sempre usare comunque).

+0

Si prega di leggere attentamente prima di fare downvoting. Come ho detto, "valori" è una funzione. NON stai convertendo quando lo chiami, perché i valori ANCHE accettano un'espressione. – ChatterOne

+0

Questo è stato un pessimo esempio, ma la tua spiegazione è sbagliata. 'values' non sta in qualche modo magicamente rilevando che l'hashref è' undef' e lo ignora; l'hash è autovivificato su un hash vuoto e "valori" agisce su questo. Puoi vedere questo con il seguente: 'perl -Mstrict -MData :: Dump -e 'sub print_args {dd \ @_} my $ href; print_args undef; print_args% {$ href} ''che stampa' [undef] 'seguito da' [] ' – ThisSuitIsBlackNot

+0

Inoltre, disattivare l'autovivificazione causa un'eccezione:' perl -e' no autovivification qw (fetch strict); il mio $ foo; valori% {$ foo} ''dà' Riferimento vivificazione proibito a -e linea 1.' – ThisSuitIsBlackNot

Problemi correlati