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

Use和Require:Perl的引用之路

发布时间:2020-12-16 00:17:59 所属栏目:大数据 来源:网络整理
导读:http://blog.chinaunix.net/uid-796091-id-2035406.html ? ? 分类: 首先是最常见的解释:Use1 use用于载入module2 use在编译时载入(验证)moduleRequire1 require用于载入module或perl程序(.pm后缀可以省略,但.pl必须有)2 require在运行时载入(验证)m

http://blog.chinaunix.net/uid-796091-id-2035406.html

?

?

分类:

首先是最常见的解释:Use1 use用于载入module2 use在编译时载入(验证)moduleRequire1 require用于载入module或perl程序(.pm后缀可以省略,但.pl必须有)2 require在运行时载入(验证)module其它区别:use引入模块的同时,也引入了模块的子模块。而require则不能引入use还调用了import静态函数,告诉包哪些特征将要被导入当前包中(有一种说法是,use等价于BEGIN{require;import})例如use CCC;require CCC;require "CCC.pm";-------------------------------------------------------------------------接下来是动态加载的方法,根据运行时不同状态(变量值)选择载入module,对应的有三种写法:eval "use $pm_name";eval "require $pm_name";#import $pm_name;require $pm_name.".pm";可以看到前两种需要借助eval,而require file则是本身支持运行时载入文件。eval中代码的编译顺序……而注释掉的import则是关于importpackageexporter的另一个话题了另外据测试,以上三种方式可以在程序的任何块中运行,包括子函数中。而在程序运行时,一般来说一个模块是不会被多次载入的。即如下代码是没错的:sub fun { require $pm; }for(1..100){ &fun; }然后测试了下鸡和蛋的问题:CCC.pm : require DDD;DDD.pm : require CCC;main.pl : use/require CCC;运行的顺序是:main_start  CCC_start  DDD_start  DDD_end  CCC_end  main_end同时DDD调用CCC中的函数也是没问题的。但是以上,如果CCC和DDD是互相use,会编译错。想一想可以理解,当然编译错……plus,之所以叫CCC和DDD,不是因为这个问题很CaoDan,而是AAA和BBB被前一个测试用了 - --------------------------------------------------------------------------这就差不多了,但是接着又做了一点令人斯巴达克斯的测法。起因是我手一抖,然后把CCC.pm当做程序入口了。那么程序是这样的:主入口:CCC.pm       ===>加载DDD.pm            ====>加载CCC.pm但是到此为止了,因为DDD已经被加载过一次了。可是CCC.pm文件确实执行了两次。还没完,但先把问题简化一下,在上例中去掉DDD,相当于在CCC.pm中require了CCC.pm虽然这种写法明显的操蛋了,但我还是想记录一下结论:这个时候,被加载的pm中的变量,相当于在内存空间中有了一个新的拷贝;和入口程序中对应的变量是独立的。可是被加载的pm中的函数,覆盖了入口程序的函数。所以你以为在入口程序中调用自己的函数,实际上调用的是被载入pm中的函数,函数内的操作,都是对pm中的变量。以上基本是猜测,等我有兴趣的时候和黑豹书相关章节参照一下……附一小段代码和结果:>>>>>>>>>>>>>>>CCC.pm>>>>>>>>>>>>>>>>>>require CCC;my $cnt;$cnt = 1000;say "cnt--start: t $cnt";&say_p();say "cnt--end: t $cnt";sub say_p{    $cnt += 1.5;    say "In say_p function:t $cnt";}输出结果:cnt--start:          1000   #pmIn say_p function:   1001.5 #pmcnt--end:            1001.5 #pmcnt--start:          1000   #入口In say_p function:   1003   #pmcnt--end:            1000   #入口-----------------------------------------------------关于不重复载入module,看了一下官方解释:Perl其实有两个明文变量: @INC和%INC前者表示搜索modules/lib的路径,后者则是包含所有已加载的module的Hash。我们知道,可以直接unshift @INC来取代use lib的,那么能不能改变%INC呢,嘿嘿……%INC中使用模块名作key,完整路径的文件名做value。所以再加上perl会在所有HOME中所有目录下依次搜索的特性,多次载入同一个pm是可能的……do除了use和require,还有一种不常用的引用方式 dodo的用法和require类似,区别是do不会检查%INC中是否已经存在(危险吧,嘿)对do的详细解释,对use和require的详细解释,参照最后的链接。library和module这个太扯了,参照最后的链接。(据验证,链接在墙内。俺是良民。)http://perl.apache.org/docs/general/perl_reference/perl_reference.html

(编辑:李大同)

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

    推荐文章
      热点阅读