首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl:函数名冲突

perl:函数名冲突
EN

Stack Overflow用户
提问于 2011-12-26 08:41:52
回答 4查看 392关注 0票数 2

假设有两个模块是我们的框架: Handler.pm和Queries.pm

Queries.pm是可选的,并在快速and进程启动时加载。

代码语言:javascript
复制
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

代码:Handler.pmQueries.pm

Queries.pm加载发生在check_module_queries (Eludia.pm的BEGIN {} )中,

使用Loader.pm (通过use Loader.pm <params>)加载每个请求

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-15 01:27:39

这些都不是正确的模块。这些只是图书馆。如果您将它们转换为具有适当名称间隔的适当模块,则不会出现此问题。你只需要做以下的事:

一揽子查询;

亚新{

代码语言:javascript
复制
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};

bless ( $self, $class );

return $self;

}

你在路上会很好的。当然,您的程序需要进行一些更改才能真正访问类函数。您可以考虑导出到函数,以可能节省一些重构时间。

我已经分叉在github的代码,并启动了一个拉请求,我希望将解决您的问题。

票数 2
EN

Stack Overflow用户

发布于 2011-12-26 09:24:03

每当加载Custom.pm:setup_page_content时,我想打电话给Custom.pm

因此,当Custom::setup_page_content存在时,您希望调用它。

代码语言:javascript
复制
if (exists(&Custom::setup_page_content)) {
   Custom::setup_page_content(...);
} else {
   Handler::setup_page_content(...);
}

有时候是不会发生的。

由于完全缺乏有关这方面的信息,我无法发表评论。密码?什么都行?

是否有办法“卸载”模块,但将其留在%INC中?

加载模块只是简单地运行它。你不能“取消”代码。充其量,您可以手动撤消运行它的一些效果。是否包括更改%INC完全取决于您。

票数 5
EN

Stack Overflow用户

发布于 2012-01-13 16:26:31

当出现名称空间冲突时,最近定义/加载的函数将优先。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8634167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档