我遇到的情况是,我正在使用的模块有一个函数,其名称与我自己模块中的函数名称完全相同。当我尝试在我的模块(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/