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

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

Например, у меня есть определенный модуль:

package Package1;

use strict;
use warnings;

BEGIN 
{
  require Exporter;
  our @ISA = qw( Exporter );
  our @EXPORT_OK = qw( subroutine1 );
}

sub subroutine1
{
  print "Hello!$/";
}

return 1;

И у меня определено приложение драйвера:

use strict;
use warnings;

use Package1;

&Package1::subroutine1;

Единственный способ, которым я могу сократить вызов subroutine1, — это создать псевдоним, подобный следующему:

*s1 = \&Package1::subroutine1;
&s1;

Конечно, я дурак и что-то здесь упускаю. Есть ли более чистый способ добиться этого?


person ardnew    schedule 28.09.2012    source источник


Ответы (2)


Изменять

use Package1;

to

use Package1 qw( subroutine1 );

или изменить

our @EXPORT_OK = qw( subroutine1 );

to

our @EXPORT = qw( subroutine1 );

Я рекомендую первую замену.

person ikegami    schedule 28.09.2012

Вы уже используете Exporter, и именно так вы этого добиваетесь. Все, что вам нужно сделать, это изменить код приложения драйвера на

use Package1 'subroutine1';

чтобы указать методу import, предоставленному Exporter, экспортировать ваш символ в вызывающий пакет.

person friedo    schedule 28.09.2012