gpt4 book ai didi

珀尔 : Two packages in same file cannot import same package?

转载 作者:行者123 更新时间:2023-12-02 07:37:42 28 4
gpt4 key购买 nike

这是一个有趣的 Perl 行为。 (至少对我来说 :) )

我有两个包 PACKAGE1PACKAGE2,它们导出具有相同名称的函数 Method1()

由于将有如此多的包将导出相同的功能,使用-ing Perl 文件中的所有内容将是乏味的。因此,我创建了一个通用包含文件 INCLUDES.pm,其中将包含这些 use

包括.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;

测试.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 使用>

基本上我想在基于偏好的模块之间实现层次结构。有什么办法吗?

最佳答案

在 Perl 中,use Module相当于

BEGIN { require Module; Module->import; }

但是require缓存已需要的模块列表。它只为每个 Perl 进程加载一次模块。所以只有第一个 use IMPORTS 做任何事情。由于您的 IMPORTS 模块没有 import 方法,因此当您再次使用 时没有任何反应。

我不太确定您要完成什么。也许您的 IMPORTS 模块应该是一个实际的包,带有一个可以导出您想要的任何功能的 import 方法。这样,每个use IMPORTS 都会将函数导出到调用它的包中。

关于珀尔 : Two packages in same file cannot import same package?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14658911/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com