假设有两个模块是我们的框架: Handler.pm和Queries.pm
Queries.pm是可选的,并在快速and进程启动时加载。
BEGIN {
&{"check_module_$_"} () foreach (Queries);
}
sub check_module_queries {
...
require Eludia::Content::Queries;
...
}每个模块函数都加载在一个公共命名空间中。
现在,在setup_page_content和Handler.pm中有两个同名函数( Queries.pm )。
setup_page_content在Handler.pm中被调用
看起来,当加载Queries.pm:setup_page_content时,原作者建议调用Queries.pm。
有时不会发生这种情况:在这些情况下,追溯(通过调用方()获得)表明,setup_page_content是从模块Handler.pm调用的
我在调用之前记录了%INC,在这些情况下它包含Queries.pm和它的完整路径。
这种行为是不一致的,在2-3%的生产安装尝试中会出现pops,主要是当我发送两个并行的相同的http请求时。适当的努力复制,我还没有确定,它是否是具体的安装。
将如何决定调用同名函数的哪个版本?
是定义良好的行为吗?
应该有一个原因,原作者是这样写代码的
更新
perl版本是v5.10.1 built for x86_64-linux-gnu-thread-multi
更新2
Queries.pm加载发生在check_module_queries (Eludia.pm的BEGIN {} )中,
使用Loader.pm (通过use Loader.pm <params>)加载每个请求
发布于 2012-01-15 01:27:39
这些都不是正确的模块。这些只是图书馆。如果您将它们转换为具有适当名称间隔的适当模块,则不会出现此问题。你只需要做以下的事:
一揽子查询;
亚新{
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless ( $self, $class );
return $self;}
你在路上会很好的。当然,您的程序需要进行一些更改才能真正访问类函数。您可以考虑导出到函数,以可能节省一些重构时间。
我已经分叉在github的代码,并启动了一个拉请求,我希望将解决您的问题。
发布于 2011-12-26 09:24:03
每当加载Custom.pm:setup_page_content时,我想打电话给Custom.pm
因此,当Custom::setup_page_content存在时,您希望调用它。
if (exists(&Custom::setup_page_content)) {
Custom::setup_page_content(...);
} else {
Handler::setup_page_content(...);
}有时候是不会发生的。
由于完全缺乏有关这方面的信息,我无法发表评论。密码?什么都行?
是否有办法“卸载”模块,但将其留在%INC中?
加载模块只是简单地运行它。你不能“取消”代码。充其量,您可以手动撤消运行它的一些效果。是否包括更改%INC完全取决于您。
发布于 2012-01-13 16:26:31
当出现名称空间冲突时,最近定义/加载的函数将优先。
https://stackoverflow.com/questions/8634167
复制相似问题