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

Perl – 子程序重新定义

发布时间:2020-12-15 21:21:34 所属栏目:大数据 来源:网络整理
导读:我以前问过这个问题或者是搜索过,看到别人问 – 为什么我得到警告“子程序mySub重新定义在../lib/Common.pm行x”?你总是在相同的代码中得到你声明的次数两次的答案。我创建了这个测试包: 完整文件————— package MyCommonPkg;use strict;sub thisSubr
我以前问过这个问题或者是搜索过,看到别人问 – 为什么我得到警告“子程序mySub重新定义在../lib/Common.pm行x”?你总是在相同的代码中得到你声明的次数两次的答案。我创建了这个测试包:

完整文件—————

package MyCommonPkg;

use strict;

sub thisSubroutineIsNotDefinedAnywhereElse{
}

1;

完整文件—————

我使用这个包从使用其他包的perl脚本,也使用这个包,我得到警告:

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

我保证我没有在其他地方宣布这个。这是由循环引用引起的?如何跟踪这个警告的原因和修复?

解决方法

你有一个依赖循环吗?如果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中重新定义的子例程的消息。

作为一般规则,两个包不应该彼此依赖。有时候,循环更难找到,因为它是由第三个包引起的。

(编辑:李大同)

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

    推荐文章
      热点阅读