gpt4 book ai didi

Perl `defined' 和 `undef' 子程序范围

转载 作者:行者123 更新时间:2023-12-04 13:57:50 25 4
gpt4 key购买 nike

请看下面的代码:

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 block 。此时,它会看到所有 sub s,并将它们记录在各自的包中。所以现在你有一个 &::myf在您的符号表中。

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

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

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

您甚至可以第二次调用 myf()在代码中有,但注释掉了。如果您删除评论,它将提示未定义的子程序 &main::myf 调用。这是对发生的事情的一个很好的暗示。

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

不同阶段的解释in perlmod .

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

关于Perl `defined' 和 `undef' 子程序范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39592197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com