pas*_*636 6 perl undef subroutine defined
请看下面的代码:
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;
Run Code Online (Sandbox Code Playgroud)
输出是
subroutine is defined
called myf
Run Code Online (Sandbox Code Playgroud)
第一个print语句可以打印,这是否意味着解释器(或编译器?)看得更远并看到子例程定义?如果是这样,为什么它没有看到undef &myf;第二个print陈述?
谢谢
sim*_*que 10
这与范围无关,但与编译时和运行时有关.这是一个简化的解释.
Perl解释器最初将扫描您的代码,并遵循任何use语句或BEGIN块.此时,它会查看所有subs,并在各自的包中记下它们.所以现在你&::myf的符号表中有一个.
当编译时间到达程序结束时,它将切换到运行时.
那时,它实际上运行代码.print如果&myf已定义,则执行您的第一个语句.我们知道它是,因为它在编译时设置.然后Perl调用该函数.一切都很好.现在您undef在符号表中输入该条目.这也发生在运行时.
之后,defined &myf返回false,因此不会打印.
你甚至myf()在代码中有第二次调用,但注释掉了.如果删除注释,它会抱怨未定义的子例程和main :: myf被调用.这对发生的事情有很好的暗示.
所以实际上它在代码中没有向前或向后看.它已经在那时完成了扫描代码.
请注意,实际undef执行函数的用例并不多.除非您想手动清理命名空间,否则我不明白为什么要删除它.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |