我正处于一种情况,我正在使用的模块具有一个函数,其名称与我自己的模块中的名称完全相同。当我尝试在我的模块中调用该函数时(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()
}
答案 0 :(得分:7)
如果名称冲突是由另一个模块的导入引起的,您可以考虑使用Sub::Import
,这样可以轻松重命名导入,即使导出模块没有明确支持,也可以{{1} } / 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()
}
这样,当编译模块时,当函数调用foo()已经绑定到导入时,导入的函数将被删除。稍后,在您的模块运行时,将安装一个名为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的任何方法调用都将解析为您自己的方法。
或者,您始终可以通过它的完全限定名称来调用函数,而不是将其导入。
foo
这也可以用于方法,完全禁用运行时方法查找:
use Some::Module ();
Some::Module::foo();
然而,需要这样做通常是设计糟糕的表现,你可能应该退一步说明你做了什么来让你进入这种情况。
答案 1 :(得分:3)
您是否需要来自违规模块的子程序?在不了解更多信息的情况下,我认为快速解决方法是明确不使用空导入列表导入它:
use Interfering::Module ();
如果您需要其他导入的东西,您可以指定所需的东西:
use Interfering::Module qw(sub1 sub2);
如果您想要的导出列表非常长,您可以只排除干扰子例程:
use Interfering::Module qw(!bad_sub);
如果这些都不起作用,您将不得不详细说明干扰模块。
答案 2 :(得分:0)
你确定这是在方法调用(即$ self->函数)而不是常规调用中发生的吗?
如果是这种情况,那么我能看到发生这种情况的唯一方法就是你的模块正在扩展另一个模块,和你没有定义有问题的方法,和< / em>您正在扩展的模块定义了一个与您尝试调用的方法同名的函数。
在任何情况下,您都无法使用use Foreign::Module ()
将违规功能导入您的命名空间。
如果这是一个被破坏的常规函数调用,您可以将其称为Your::Module->function
。