Perl`定义'和`undef'子程序范围

时间:2016-09-20 10:52:58

标签: perl subroutine 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 个答案:

答案 0 :(得分:10)

这与范围无关,但编译时运行时间。这是一个简单的解释。

Perl解释器最初将扫描您的代码,并遵循任何use语句或BEGIN块。此时,它会看到所有sub s,并在各自的包中记下它们。所以现在你的符号表中有一个&::myf

当编译时间到达程序结束时,它将切换到运行时。

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

之后,defined &myf返回false,因此无法打印。

您甚至在代码中第二次调用myf(),但已注释掉了。如果你删除评论,它会抱怨 Undefined subroutine& main :: myf called 。这对所发生的事情有很好的暗示。

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

解释了不同的阶段in perlmod

请注意,实际undef函数没有很多用例。除非您想手动清理命名空间,否则我不明白为什么要删除它。