加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl`defined’和`undef’子例程范围

发布时间:2020-12-15 22:04:59 所属栏目:大数据 来源:网络整理
导读:请看下面的代码: use strict;use warnings;print "subroutine is definedn" if defined myf;myf();sub myf{ print "called myfn";}undef myf;#myf();print "now subroutine is definedn" if defined myf; 输出是 subroutine is definedcalled myf 第一个
请看下面的代码:
use strict;
use warnings;


print "subroutine is definedn" if defined &myf;
myf();

sub myf
{
        print "called myfn";
}

undef &myf;
#myf();
print "now subroutine is definedn" if defined &myf;

输出是

subroutine is defined
called myf

第一个print语句可以打印,这是否意味着解释器(或编译器?)进一步查看并查看子例程定义?如果是这样,为什么它没有看到undef& myf;作为第二个印刷声明?

谢谢

解决方法

这与范围无关,但与编译时和运行时有关.这是一个简化的解释.

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

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

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

之后,定义的& myf返回false,因此不会打印.

你甚至在代码中第二次调用myf(),但是注释掉了.如果你删除评论,它会抱怨未定义的子程序& main :: myf被调用.这对发生的事情有很好的暗示.

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

in perlmod解释了不同的阶段.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读