2014-11-11 9 views
6

Mam te dwa fragmenty kodu, które pozornie powinny dawać taki sam wynik, ale drugi powoduje błąd.Brakujący błąd dla niezdefiniowanej wartości jako wartości skrótu

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 

Dlaczego mając values w tej samej linii umożliwienia go do pracy? Wolałbym, aby obaj popełnili błąd, ponieważ używanie nieokreślonej wartości jako odnośnika hash jest oczywistym błędem. Nie mam żadnych nowych wersji perla do testowania, ale było to powtarzalne w 5.8.8 i 5.10.1.

+1

Myślę, że [to podobne pytanie SO] (http://stackoverflow.com/q/6419618) o odniesieniach tablicowych dotyczy również tutaj. ikegami mówi: "Dereferences autovivify w kontekście lwartości (czyli kiedy oczekiwana jest wartość modyfikowalna)." 'perldoc -f wartości' mówi" Zauważ, że wartości nie są kopiowane, co oznacza, że ​​modyfikowanie ich spowoduje modyfikację zawartości skrótu ". – 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

Jeśli było to związane z autoworyzacją, oczekiwałbym, że "brak autoworyzacji" spowoduje błąd w pierwszym fragmencie. To nie. – AKHolland

Odpowiedz

-1

Wartości są funkcją i akceptuje hash, tablicę lub wyrażenie ogólne jako argument (jak podano here). Jeśli przekazujesz undef jako argument do "wartości", po prostu wykrywa go jako pusty i nie zwraca żadnej wartości. Z drugiej strony, jeśli spróbujesz jawnie przekonwertować undef na hasz, nie powiedzie się, ponieważ brakuje pary klucz-wartość.

EDYTOWANIE: Tylko dokładne. Ten błąd występuje w przypadku dyrektywy "ścisłej" (której należy zawsze używać).

+0

Przeczytaj uważnie przed opuszczeniem. Jak już powiedziałem, "wartości" to funkcja. NIE dokonujesz konwersji podczas wywoływania, ponieważ wartości akceptują również wyrażenie. – ChatterOne

+0

To był zły przykład, ale twoje wyjaśnienie jest błędne. "wartości" nie jest w jakiś sposób magicznym wykryciem, że hashref to 'undef' i ignorowanie go; skrót jest autoworyzowany do pustego hasha, a "wartości" działają na nim. Możesz to zobaczyć za pomocą: 'perl -Mstrict -MData :: Dump -e 'sub print_args {dd \ @_} my $ href; print_args undef; print_args% {$ href} '', który drukuje' [undef] ', po którym następuje' [] ' – ThisSuitIsBlackNot

+0

Ponadto wyłączenie autowzrostu powoduje wyjątek:' perl -e' bez autoworyzacji qw (pobierz strict); my $ foo; Wartości% {$ foo} '' daje 'Odmowa odniesienia Odmowa w linii-e 1.' – ThisSuitIsBlackNot

Powiązane problemy