从重复包含一个文件来看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';结果是一样的。

 

 

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值