Mar*_*ark 4 perl naming function
我正处于一种情况,我正在使用的模块具有一个函数,其名称与我自己的模块中的函数完全相同.当我尝试在我的模块中调用该函数(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()
}
Run Code Online (Sandbox Code Playgroud)
如果名称冲突是由另一个模块导入引起的,您可以考虑使用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()
}
Run Code Online (Sandbox Code Playgroud)
命名空间清理模块仅在导入使用函数遮蔽任何方法时才有用,而不是在任何其他情况下:
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;
Run Code Online (Sandbox Code Playgroud)
这样,当编译模块时,当函数调用foo()已经绑定到导入时,将删除导入的函数.稍后,在您的模块运行时,foo将安装一个名为的方法.方法解析总是在运行时发生,因此对 - > foo的任何方法调用都将解析为您自己的方法.
或者,您始终可以通过它的完全限定名称来调用函数,而不是导入它.
use Some::Module ();
Some::Module::foo();
Run Code Online (Sandbox Code Playgroud)
这也可以用于方法,完全禁用运行时方法查找:
$obj->Some::Module::foo();
Run Code Online (Sandbox Code Playgroud)
然而,需要这样做通常是设计糟糕的迹象,你可能应该退一步,并解释你做了什么,让你首先进入这种情况.