2016-03-12 11 views
7

mi sono imbattuto in questo, mi aspettavo di essere un errore di battitura per [email protected]:

use strict; 
use warnings; 

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

warn @$; 

E con mia grande sorpresa Risulterà:

Impossibile individuare il metodo oggetto "nuovo" tramite pacchetto "Not :: Qui"(forse si è dimenticato di caricare "Not :: Here"?) alla linea dollar_array.pl 6. ... catturato in linea dollar_array.pl 9.

sono in grado di trovare qualsiasi informazioni su @$, e non è elencato sul perlvar, né eval

Dal momento che l'esposizione di uscita caught at ..., sembra che questo è qualcosa nella gestione delle eccezioni di perl.

risposta

14

@$ non ha alcun significato (ancora) in Perl. Esiste perché esiste $$ (per ogni variabile speciale "sigil-char" esistono tutte le altre variabili "another_sigil-char"). Pertanto, warn non ottiene argomenti: puoi verificarlo utilizzando solo warn; - otterrai lo stesso risultato.

Ora, cerchiamo di leggere la documentazione per warn:

Se l'uscita è vuota e [email protected] contiene già un valore (tipicamente da un eval precedente) tale valore viene utilizzato dopo aggiungendo "\t...caught"-[email protected]. Questo è utile per rimanere quasi, ma non del tutto simile a die.

[email protected] contiene l'eccezione dallo eval, quindi il comportamento è previsto.