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 блоки. В этот момент он видит все subs, и записывает их в соответствующие пакеты. Итак, теперь у вас есть &::myf в вашей таблице символов.

Когда время компиляции достигнет конца программы, она перейдет во время выполнения.

В этот момент он фактически запускает код. Ты первый print оператор выполняется, если &myf определено. Мы знаем, что это так, потому что это было установлено во время компиляции. Затем Perl вызывает эту функцию. Все хорошо. Теперь ваша очередь undef эта запись в таблице символов. Это происходит и во время выполнения.

После этого, defined &myf возвращает false, поэтому он не печатается.

У вас даже есть второй звонок myf() там в коде, но закомментировано. Если вы удалите комментарий, он будет жаловаться на неопределенную подпрограмму &main::myf. Это хороший намек на то, что случилось.

Так что на самом деле он не смотрит вперед или назад в коде. В это время уже завершено сканирование кода.


Различные этапы описаны в perlmod.

Обратите внимание, что на самом деле не так много вариантов использования undefиспользование функции. Я не понимаю, почему вы удалите его, если вы не хотите очистить свое пространство имен вручную.

Другие вопросы по тегам