假设我们的框架有两个模块:Handler.pm和Queries.pm
Queries.pm是可选的,并在fastcgi进程启动时加载
BEGIN {
&{"check_module_$_"} () foreach (Queries);
}
sub check_module_queries {
...
require Eludia::Content::Queries;
...
}
每个模块功能都加载到一个公共名称空间中
现在,在Handler.pm和Queries.pm中有两个具有相同名称(setup_page_content)的函数
在Handler.pm中正在调用setup_page_content
似乎原作者建议每次加载Queries.pm时都将调用Queries.pm:setup_page_content。
有时它不会发生:在这些情况下的回溯(通过调用方()获得)表明,setup_page_content是从模块Handler.pm中调用的
我在通话前登录了%INC,其中包含Queries.pm及其完整路径(在这些情况下)
这种行为是不一致的,并且在生产安装尝试中出现2-3%时会弹出,主要是在我发送两个并行的相同http请求时。是否需要进行大量的复制工作,但仍不确定是否特定于安装。
如何确定将调用具有相同名称的哪个版本的函数?
行为明确吗?
应该是有原因的,原始作者是这样写代码的
更新
perl版本为
v5.10.1 built for x86_64-linux-gnu-thread-multi
更新2
代码:Handler.pm和Queries.pm
Queries.pm加载发生在check_module_queries(Eludia.pm的BEGIN {})中,
使用Loader.pm为每个请求加载(通过
use Loader.pm <params>
) 最佳答案
这些不是正确的模块。这些只是库。如果将它们变成具有适当名称间隔的适当模块,则不会出现此问题。您几乎不需要做以下任何事情:
包查询;
子新{
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless ( $self, $class );
return $self;
}
而且您会顺利进行的。当然,您的程序将需要进行一些更改才能实际访问类函数。您可以查看导出到这些功能,以节省一些重构时间。
我在github上分叉了代码,并发起了pull请求,希望可以解决您的问题。
关于perl - perl:函数名称冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8634167/