微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从重复包含一个文件来看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则不能引入,要在重新声明

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

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

  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';结果是一样的。

 

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐