Perl, как получить доступ к func, когда модуль импортируется на лету - PullRequest
2 голосов
/ 02 сентября 2011

У меня есть модуль, который выглядит так:

package Test;
use strict;
use warnings;

sub hello {
    my $val = shift
    print "val = $val\n";
}

и в другой модуль я вставляю вот так:

my $module = 'Test'
eval "require $module";

Как я могу вызвать функцию hello во втором модуле / я имею в виду как функцию, а не как метод /.

Ответы [ 3 ]

3 голосов
/ 02 сентября 2011

Вы можете использовать символическую ссылку:

{
    no strict 'refs';   # disable strictures for the enclosing block
    &{ $module . '::hello' };
}

Кроме того, вы можете экспортировать функцию в вызывающий пакет (см. Экспортер ):

package Test;
use Exporter 'import';
our @EXPORT = qw(hello);

sub hello {
...
}

Тогда в вашем коде:

my $module = 'Test'
eval "use $module";
hello("test");
2 голосов
/ 02 сентября 2011

Другой способ:

$module->can('hello')->('test');
1 голос
/ 02 сентября 2011

Вы можете использовать тот же eval в этих целях:

my $module = 'Test'
eval "require $module";

eval $module . "::hello()";

Также вы можете получить доступ к таблице символов и получить ссылку на код необходимого подпункта:

my $code = do { no strict 'refs'; \&{ $module . '::hello' } };
$code->();

Но это не выглядит так чисто.

Однако, если вам нужен метод-вызов по имени пакета, вы можете использовать просто:

$module->new();

Это также может быть полезно

...