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

从重复包含一个文件来看require 和 use 的区别和联系

发布时间:2020-12-16 00:37:32 所属栏目:大数据 来源:网络整理
导读:?个人水平有限,如有错误,请赐教! 如果从网上搜索require和use的区别和联系,绝对是一搜一大堆,但还是很含糊,基本上都知道他们之间有以下三点区别: ? ? 第一、 Perl use 只能够引用模块,而require没有限制,例如: ?????????????有一个模块 TEST.pm(在

?个人水平有限,如有错误,请赐教!

如果从网上搜索require和use的区别和联系,绝对是一搜一大堆,但还是很含糊,基本上都知道他们之间有以下三点区别:

?

?

第一、Perl use只能够引用模块,而require没有限制,例如:

?????????????有一个模块 TEST.pm(在/home下),则引用这个模块的可用方法:

???????????? require "/home/TEST.pm";? require '/home/TEST.pm';?? require TEST;? use TEST;

?

第二、Perl use语句是编译时引入的,require是运行时引入的

第三,Perl use引入模块的同时,也引入了模块的子模块。而require则不能引入,要在重新声明

但是对于第二点和第三点我一直是含糊不清,今天这个例子可以帮助理解下,但还是比较肤浅的。

测试环境如下:不管模块的目录问题。

  1. 有如下模块:AAA.pl,BBB.pm,test.pl。其中BBB.pm为一个模块。
  2. 各个模块的代码如下:

??? AAA.pl :

??????????

?

??? BBB.pm :

????????

?

??? test.pl

???????

?

??????

1)?????这时perl test.pl,结果如下:

????????

??????? 这时可以看到模块CCC和BBB都有bb_test函数的符号表。但是模块CCC中没有a_test函数的符号表。就其原因,个人认为用到上面提到的知识点了。

??????? use 语句是编译时引用的,并且同时也引入子模块(在这里是AAA.pl)。而require是运行引入的。另外一个规则是用动态引用任何一个子模块时,

??????? 只能被引入一次。

??????? 所以在这里就表现use 先引入AAA.pl,而 require后动态引入,但是发现AAA.pl已经被引入了,所以就不再引入了。同时对于BBB.pl中的bb_test函数

??????? 两者都拥有,但是当实际调用时用到的上下文环境是BBB.pl中的。(如果有时间后面会讨论这个问题,这也是和require的另一个区别

?

?

?

?

?

2)

? ???? 如果#1-3所注的那行如果加上:则会出现

?

????????

3)

???????如果#1-1所在的那行注视掉,并且加上#1-3则会出现

???????

???????看到第一行是所允许a_test()的输出结果,可以看到模块CCC中有a_test函数的符号表。

?????? 原因是上面的require的先执行,后面的#1-2才执行。

?????? 同时也发现模块CCC中没有了bb_test函数的符号表,具体原因应该是BBB.pm中有一个包(BBB),

?????? 而require就想当于include,只不过是动态执行了。从此可见use 和require的区别还是

???????挺大的。

?????? 其中把#1-2换成 require '/home/ansx/perl/bol/BBB.pl';结果是一样的。

?

?

?这篇到此为止了,解释的不多,我觉得从代码中看结果和思考更有感觉。

(编辑:李大同)

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

    推荐文章
      热点阅读