个人水平有限,如有错误,请赐教!
如果从网上搜索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则不能引入,要在重新声明
但是对于第二点和第三点我一直是含糊不清,今天这个例子可以帮助理解下,但还是比较肤浅的。
测试环境如下:不管模块的目录问题。
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';结果是一样的。
这篇到此为止了,解释的不多,我觉得从代码中看结果和思考更有感觉。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。