从重复包含一个文件来看require 和 use 的区别和联系
如果从网上搜索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';结果是一样的。 ? ? ?这篇到此为止了,解释的不多,我觉得从代码中看结果和思考更有感觉。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |