Область действия подпрограммы Perl "defined" и "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 вызывает эту функцию. Все хорошо. Теперь ты!--6--> запись в таблице символов. Это происходит и во время выполнения.

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

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

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


различные этапы объясняются в perlmod.

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