Perl `определенные 'и`undef' область действия подпрограммы
Пожалуйста, взгляните на следующий код:
use strict;
use warnings;
print "subroutine is defined\n" if defined &myf;
myf();
sub myf
{
print "called myf\n";
}
undef &myf;
#myf();
print "now subroutine is defined\n" if defined &myf;
Выход
subroutine is defined
called myf
Первый print
оператор может распечатать, значит ли это, что интерпретатор (или компилятор?) смотрит дальше и видит определение подпрограммы? Если так, то почему он не видит undef &myf;
как второй print
заявление?
Спасибо
1 ответ
Это связано не с областью действия, а со временем компиляции и выполнения. Вот упрощенное объяснение.
Интерпретатор Perl будет сканировать ваш код изначально и следовать любым use
заявления или BEGIN
блоки. В этот момент он видит все sub
s, и записывает их в соответствующие пакеты. Итак, теперь у вас есть &::myf
в вашей таблице символов.
Когда время компиляции достигнет конца программы, она перейдет во время выполнения.
В этот момент он фактически запускает код. Ты первый print
оператор выполняется, если &myf
определено. Мы знаем, что это так, потому что это было установлено во время компиляции. Затем Perl вызывает эту функцию. Все хорошо. Теперь ваша очередь undef
эта запись в таблице символов. Это происходит и во время выполнения.
После этого, defined &myf
возвращает false, поэтому он не печатается.
У вас даже есть второй звонок myf()
там в коде, но закомментировано. Если вы удалите комментарий, он будет жаловаться на неопределенную подпрограмму &main::myf. Это хороший намек на то, что случилось.
Так что на самом деле он не смотрит вперед или назад в коде. В это время уже завершено сканирование кода.
Различные этапы описаны в perlmod.
Обратите внимание, что на самом деле не так много вариантов использования undef
использование функции. Я не понимаю, почему вы удалите его, если вы не хотите очистить свое пространство имен вручную.