2016-03-12 5 views
7

Я наткнулся на это, ожидая, что это опечатка для [email protected]:

use strict; 
use warnings; 

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

warn @$; 

И к моему удивлению, он выводит это:

Не удается найти метод объекта «новый» с помощью пакета «Не :: Здесь»(возможно, вы забыли загрузить„Не :: Здесь“?) в dollar_array.pl линии 6. ... поймали на dollar_array.pl линии 9.

Я не могу найти какой-либо информация о @$, и это не котируются на perlvar, ни в eval

Поскольку выходной шоу caught at ..., кажется, что это что-то в обработке исключений из Perl.

ответ

14

@$ не имеет значения (пока) в Perl. Он существует, потому что существует $$ (для каждой специальной переменной «sigil-char» существуют все остальные переменные «another_sigil-char»). Поэтому warn не получает аргументов - вы можете проверить, что с помощью только warn; вы получите тот же результат.

Теперь давайте читать документацию для warn:

Если вывод пуст и [email protected] уже содержит значение (как правило, от предыдущего Eval), что значение используется после добавления "\t...caught" к [email protected]. Это полезно для почти, но не совсем похожего на die.

[email protected] содержит исключение из eval, поэтому ожидается поведение.

Смежные вопросы