gpt4 book ai didi

perl:函数名称冲突

转载 作者:行者123 更新时间:2023-12-04 06:36:04 27 4
gpt4 key购买 nike

比方说,我们的框架有两个模块:Handler.pm 和 Queries.pm

Queries.pm 是可选的,在 fastcgi 进程启动时加载

BEGIN {
&{"check_module_$_"} () foreach (Queries);

}

sub check_module_queries {
...
require Eludia::Content::Queries;
...
}

每个模块函数都加载在一个公共(public)命名空间中

现在,在 Handler.pm 和 Queries.pm 中有两个同名函数(setup_page_content)

setup_page_content 在 Handler.pm 中被调用

看起来原作者建议只要加载 Queries.pm 就会调用 Queries.pm:setup_page_content

有时它不会发生:在这些情况下,回溯(通过 caller () 获得)表明 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.pmQueries.pm

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

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

最佳答案

I'd like to call Custom.pm:setup_page_content, whenever Custom.pm is loaded

所以你想在 Custom::setup_page_content 存在时调用它。

if (exists(&Custom::setup_page_content)) {
Custom::setup_page_content(...);
} else {
Handler::setup_page_content(...);
}

Sometimes it doesn't happen.

完全缺乏关于此的信息使我无法发表评论。代码?有什么事吗?


Is there a way to 'unload' a module but leave it in %INC?

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

关于perl:函数名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8634167/

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