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
函数的用例并不多。我不明白你为什么要删除它,除非你想手动清理你的命名空间。
请看下面的代码:
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
函数的用例并不多。我不明白你为什么要删除它,除非你想手动清理你的命名空间。