Perl - 重新定义的子程序

标签 perl subroutine

我之前已经问过这个问题,或者搜索过并看到其他人问过 - 为什么我会收到警告“Subroutine mySub redefined at ../lib/Common.pm line x”?并且您总是会得到在同一代码中两次声明 sub 的答案。我创建了这个测试包:

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

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 中的子例程的消息。

作为一般规则,两个包不应相互依赖。然而有时循环更难定位,因为它是由第三个包引起的。

关于Perl - 重新定义的子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428264/

相关文章:

regex - 为什么 Perl 会提示\Q..\E 正则表达式部分中的括号不匹配?

perl - 是否可以只对 Perl 中的子例程调用进行计时?

perl - 如何将常量传递给Perl子例程?

vba - 在 VBA 中无法从工作簿事件处理程序 Workbook_BeforeClose 或 Workbook_Deactivate() 调用工作表中的子例程

perl - 新手在 Clojure 中转换 CSV 文件

regex - 在 awk 中使用 Perl 正则表达式属性

perl - Perl 中的今天日期,格式为 MM/DD/YYYY

perl - 为什么在使用 `do` 函数时无法加载 Perl 库?

perl - 如何检查是否使用对象调用方法调用了子例程