gpt4 book ai didi

Perl 函数名冲突

转载 作者:行者123 更新时间:2023-12-04 22:37:25 24 4
gpt4 key购买 nike

我的情况是,我正在使用的模块有一个函数,其名称与我自己模块中的函数名称完全相同。当我尝试在我的模块(OO Perl,所以 $self->function )中调用该函数时,它正在从另一个模块调用该函数。

我已经通过重命名我的函数来解决它,但有趣的是,有没有办法从我的模块中显式调用函数?

编辑:
这基本上就是我正在做的

package Provider::WTO;

use base qw(Provider); # Provider contains a method called date

use utilities::utils; #not my module so don't blame me for the horrendous name :-)
...
sub _get_location
{
my $self = shift;
return $self->date."/some_other_string"; # calls utilities::utils::date()
}

最佳答案

如果名称冲突是由另一个模块的导入引起的,您可以考虑 Sub::Import ,它允许轻松重命名导入,即使导出模块没有明确支持,或者 namespace::autoclean/namespace::clean .

package YourPackage;

use Sub::Import 'Some::Module' => (
foo => { -as => 'moo' },
); # imports foo as moo

sub foo { # your own foo()
return moo() * 2; # call Some::Module::foo() as moo()
}

命名空间清理模块仅在导入使用函数遮蔽您的任何方法时才有用,在任何其他情况下都没有:
package YourPackage;

use Some::Module; # imports foo
use Method::Signatures::Simple
use namespace::autoclean; # or use namespace::clean -except => 'meta';

method foo {
return foo() * 2; # call imported thing as a function
}

method bar {
return $self->foo; # call own foo() as a method
}

1;

这样,当对 foo() 的函数调用已经绑定(bind)到导入时,导入的函数将在编译模块后被删除。稍后,在您的模块运行时,一个名为 foo 的方法将被安装。方法解析总是在运行时发生,因此任何对 ->foo 的方法调用都将解析为您自己的方法。

或者,您始终可以通过它的完全限定名称调用函数,而不是导入它。
use Some::Module ();
Some::Module::foo();

这也可以对方法进行,完全禁用运行时方法查找:
$obj->Some::Module::foo();

然而,需要这样做通常是糟糕设计的标志,你可能应该退后一步,解释一下你首先做了什么让你陷入这种情况。

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

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