2010-09-09 3 views
2

Я в ситуации, когда модуль, который я использую, имеет функцию, чье имя точно такое же, как и в моем собственном модуле. Когда я пытаюсь вызвать функцию в моем модуле (OO Perl, так $self->function), он вызывает функцию из другого модуля.Perl имя функции clash

У меня уже есть это, переименовав мою функцию, но, как вопрос интереса, есть ли способ явного вызова функции из моего модуля?

редактировать: это по сути то, что я делаю

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

Не могли бы вы рассказать нам больше? Как вы загружаете другой модуль и т. Д.? –

+0

Также, когда вы добавляете 'use strict; использовать предупреждения; – darch

ответ

0

Вы уверены, что это происходит в вызове метода (т.е. $ self-> функции), а не обычный вызов?

Если это так, то единственный способ, которым я могу видеть, что это произойдет, ваш модуль расширяет другой модуль, и вы не определяющий метод в вопросе, и модуль, который вы будете простирающийся определяет функцию с тем же именем, что и метод, который вы пытаетесь вызвать.

В любом случае вы не можете импортировать функцию нарушения в свое пространство имен с use Foreign::Module().

Если это обычный вызов функции, который сбивается, вы можете ссылаться на него как Your::Module->function.

+0

Это определенно вызов метода – Mark

+0

, а остальная часть комментария, вы используете этот другой модуль как свой класс? – MkV

+0

Определенно нет, но вы пробежали мою память. Класс, вызываемый методом, является потомком класса, в котором определяется метод. Это имеет значение? – Mark

7

Если имя конфликт вызван импортом из другого модуля, который вы могли бы рассмотреть либо 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(); 

Однако необходимости делать это, как правило, является признаком плохой дизайн, и вы, вероятно, следует сделать шаг назад немного и объясните, что вы сделали, чтобы в первую очередь вы попали в эту ситуацию.

3

Вам нужна эта подпрограмма из нарушителя?Не зная об этом больше, я думаю, что быстро исправить это явно не импортировать его с пустым списком импорта:

use Interfering::Module(); 

Если вам нужны другие импортные вещи, вы можете указать те, что вам нужно:

use Interfering::Module qw(sub1 sub2); 

Если список экспорта вы хотите действительно долго, вы можете просто исключить мешающую подпрограмму:

use Interfering::Module qw(!bad_sub); 

Если ни одна из этих работ, вы должны будете говорить больше о мешающем модуле ,

+0

Оскорбительный модуль не определяет @EXPORT или @EXPORT_OK, чтобы автоматически импортировать каждую функцию, не так ли? – Mark

+0

Нет, наоборот. Без @EXPORT ничего не импортируется. Использует ли он экспортера? Если он определяет свою собственную процедуру import(), он может делать все, что захочет. Что произойдет, когда вы попробуете мой совет? –

+0

Нет, это просто файл .pm, который определяет кучу функций. Даже если я импортирую только те функции, которые я хочу (не включая дату), он по-прежнему вызывает неправильную функцию даты. – Mark

Смежные вопросы