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

Use和Require,Perl的引用之路动态加载

  先是最常见的解释:

  Use

  1 use用于载入module

  2 use在编译时验证module

  Require

  1 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 #pm   In say_p function: 1001.5 #pm   cnt--end: 1001.5 #pm   cnt--start: 1000 #入口   In say_p function: 1003 #pm   cnt--end: 1000 #入口

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

相关推荐