Perl `defined' 和 `undef' 子程序作用域

Perl `defined' and `undef' subroutine scope

请看下面的代码:

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 语句?

谢谢

这与作用域无关,但与编译时间运行时间有关。这是一个简化的解释。

Perl 解释器将首先扫描您的代码,然后执行任何 use 语句或 BEGIN 块。那时,它会看到所有 sub,并将它们记录在各自的包中。所以现在你的符号 table.

中有一个 &::myf

当编译时间到达程序末尾时,将切换到运行时间。

那时,它实际上是 运行 代码。如果定义了 &myf,则执行第一个 print 语句。我们知道它是,因为它是在编译时设置的。 Perl 然后调用该函数。一切都很好。现在您 undef 符号 table 中的条目。这也发生在 运行 时间。

之后,defined &myf returns false,所以不打印。

您甚至在代码中对 myf() 进行了第二次调用,但被注释掉了。如果你去掉注释,它会抱怨Undefined subroutine &main::myf called。这是对发生的事情的一个很好的暗示。

所以实际上它并没有在代码中向前看或向后看。那个时候已经扫完码了


不同阶段的解释in perlmod

请注意,实际 undef 函数的用例并不多。我不明白你为什么要删除它,除非你想手动清理你的命名空间。