perl - Perl子程序重新定义

  显示原文与译文双语对照的内容

我曾经问过这个问题或者看到了他们问的问题- 为什么要获得警告"子程序mySub在.. /lib/Common.pm 行x 重定义。"? 当你在同一个代码中两次声明 sub sub总是得到答案。 我创建了这个测试包:

整个文件 ----------------


package MyCommonPkg;



use strict;



sub thisSubroutineIsNotDefinedAnywhereElse{


}



1;



整个文件 ----------------

我从一个perl脚本中使用了这个包,它使用了它的他包,也使用了这个包,我得到警告:

../lib/MyCommonPkg.pm 第 19行重新定义了子程序 ThisSubroutineIsNotDefinedAnywhereElse 。

我保证我没有在其他地方声明这个子。 这是由循环引用引起的? 如何继续跟踪这里警告的原因并修复?

时间: 原作者:

你有依赖循环? 如果Perl开始编译脚本并遇到类似这样的行:

 
use PackageA;



 

Perl暂停脚本的编译;定位 PackageA.pm 并开始编译它。 如果遇到类似这样的行:

 
use PackageB;



 

Perl暂停PackageA的编译;查找 PackageB.pm 并开始编译它。 通常,这将成功完成,并且Perl会返回完成编译 PackageA,当成功完成编译脚本时,将开始执行编译操作。

但是,如果 PackageB.pm 包含此行,则为

 
use PackageA;



 

你可能期望它不会做什么,因为Perl已经处理了 PackageA.pm 但问题是它还没有完成。 所以Perl将暂停PackageB的编译,并从开始开始重新编译 PackageA.pm 。 可以触发你看到的关于PackageA中的子例程重定义的信息。

一般来说,两个软件包不应该互相依赖。 然而,由于它是由第三个包引起的,所以循环有时很难定位。

原作者:
...