【发布时间】:2013-01-17 12:14:14
【问题描述】:
这是一个有趣的 Perl 行为。 (至少对我来说:))
我有两个包 PACKAGE1 和 PACKAGE2 导出具有相同名称的函数 Method1()。
由于会有很多包导出相同的功能,use-ing Perl 文件中的所有内容都将是乏味的。所以,我创建了一个通用包含文件INCLUDES.pm,其中将包含这些uses。
包括.pm:
use PACKAGE1;
use PACKAGE2;
1;
PACKAGE1.pm:
package PACKAGE1;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
Method1
);
sub Method1{
print "PACKAGE1_Method1 \n";
}
1;
PACKAGE2.pm:
package PACKAGE2;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
Method1
);
sub Method1{
print "PACKAGE2_Method1 \n";
}
1;
Tests.pl:
##################first package################
package Test1;
use INCLUDES;
my @array = values(%INC);
print "@array \n";
Method1();
##################second package################
package Test2;
use INCLUDES; #do "INCLUDES.pm";
my @array = values(%INC);
print "@array \n";
Method1();
动机是,在任何 Perl 文件中只能使用最新包的 Method1()。
输出让我感到惊讶。
我希望Tests.pl 中的两个Method1() 调用都应该成功。
但只有第一个 Method1() 执行,第二个 Method1() 调用显示“未定义”。
输出:
C:/Perl/site/lib/sitecustomize.pl PACKAGE1.pm C:/Perl/lib/Exporter.pm PACKAGE2
.pmINCLUDES.pm
PACKAGE2_Method1
C:/Perl/site/lib/sitecustomize.pl PACKAGE1.pm C:/Perl/lib/Exporter.pm PACKAGE2
.pm INCLUDES.pm
Undefined subroutine &Test2::Method1 called at C:\Temp\PackageSample\Tests.pl line 15.
有人对此有任何答案/看法吗?
实际场景:
多个 Perl 模块中的方法将具有相同的名称。但是只能使用高优先级 perl 模块中的方法。
例如,如果PACKAGE1 包含Method1(), Method2() & PACKAGE2 仅包含Method1(),则Method1() 应从PACKAGE2 使用& Method2() 应从PACKAGE1 使用
基本上我想在基于 Preference 的模块之间实现层次结构。有什么办法吗?
【问题讨论】:
-
虽然我可以尝试想出一些方法让它“工作”,但我有两个问题。 1)第二个输出应该是什么(“PACKAGE2_Method1”也是?)。 2)你能不能使用某种类调度,这样你就不会有这种巨大的歧义,这对于未来的人来说似乎是一场调试噩梦。
-
是的。第二个输出也是“PACKAGE2_Method1”。实际情况是,多个 Perl 模块中的方法将具有相同的名称。但是只能使用高优先级 perl 模块中的方法。例如,如果
PACKAGE1包含Method1(), Method2()和PACKAGE2仅包含Method1(),则Method1()应取自PACKAGE2和Method2()应取自PACKAGE1。基本上我想在基于 Preference 的模块之间实现层次结构。 -
我同意 Joel 的观点,这听起来像是一场正在酝酿中的维护噩梦 - 当维护程序员(很可能是您自己的未来版本)看到对
Method1的调用时,他将不知道在哪里寻找它的定义,很可能会在错误的地方寻找并尝试调试甚至没有运行的代码。当您说“模块之间的层次结构”时,给我的印象是您正在尝试重新发明面向对象的继承和多态性;如果是这样,请使用现有的、经过验证的 OO 技术,而不是糟糕地重新发明它们。
标签: perl perl-module