Если имя конфликт вызван импортом из другого модуля, который вы могли бы рассмотреть либо 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(), уже привязана к импорту. Позже, во время выполнения модулей, вместо него будет установлен метод с именем foo
. Разрешение метода всегда происходит во время выполнения, поэтому любой вызов метода -> foo будет разрешен для вашего собственного метода.
В качестве альтернативы вы всегда можете вызвать функцию с полным именем и не импортировать ее.
use Some::Module();
Some::Module::foo();
Это также может быть сделано для методов, полностью отключив метод выполнения поиска в:
$obj->Some::Module::foo();
Однако необходимости делать это, как правило, является признаком плохой дизайн, и вы, вероятно, следует сделать шаг назад немного и объясните, что вы сделали, чтобы в первую очередь вы попали в эту ситуацию.
Не могли бы вы рассказать нам больше? Как вы загружаете другой модуль и т. Д.? –
Также, когда вы добавляете 'use strict; использовать предупреждения; – darch