2016-03-12 36 views
7

natknąłem tego, spodziewałem się, że to literówka dla [email protected]:

use strict; 
use warnings; 

eval { 
    my $error = Not::Here->new(); 
}; 

warn @$; 

i ku mojemu zdziwieniu wyprowadza to:

nie można zlokalizować obiektu metoda "nowy" za pośrednictwem pakietu „Not :: Here”(być może zapomniałeś załadować "Not :: Here"?) w wierszu dollar_array.pl 6. ... złowione w linii dollar_array.pl 9.

jestem w stanie znaleźć dowolny informacje o @$, i to nie jest notowana na perlvar, ani w eval

Od momentu pojawienia wyjściowego caught at ..., wydaje się, że jest to coś w obchodzeniu wyjątkiem Perl.

Odpowiedz

14

@$ nie ma żadnego znaczenia (jeszcze) w Perlu. Istnieje, ponieważ istnieje $$ (dla każdej specjalnej zmiennej "sigil-char", istnieją wszystkie pozostałe zmienne "another_sigil-char"). Dlatego warn nie otrzymuje żadnych argumentów - możesz to sprawdzić, używając tylko warn; - otrzymasz te same dane wyjściowe.

A teraz zapoznać się z dokumentacją dla warn:

Jeśli wyjście jest pusty i [email protected] już zawiera wartość (zwykle z poprzedniego eval), która wartość jest używana po dołączanie "\t...caught" do [email protected]. Jest to przydatne do pozostania prawie, ale nie do końca podobnym do die.

[email protected] zawiera wyjątek od eval, więc zachowanie jest oczekiwane.