Как написать ссылку на функцию в модуле Perl? - PullRequest
8 голосов
/ 04 февраля 2010

Я пытаюсь выяснить, как заставить справочник функций работать для модуля Perl. Я знаю, как сделать это вне модуля, но внутри одного? Рассмотрим код, подобный следующему:

==mymodule.pm==
1 sub foo { my $self = shift; ... }
2 sub bar { my $self = shift; ... }
3 sub zip {
4   my $self = shift;
5   my $ref = \&foo;
6   $self->&$foo(); # what syntax is appropriate?
7 }
==eof===

Посмотрите на строки 5-6 выше. Каков правильный синтаксис для (1) определения ссылки на функцию в первую очередь и (2) разыменования ее?

Ответы [ 3 ]

23 голосов
/ 04 февраля 2010

TMTOWTDI

Определение ссылки на функцию:

$ref = \&subroutine;
$ref = sub { BLOCK };
$ref = "subroutineName"; # or $ref = $scalarSubroutineName

Разыменование:

$ref->(@args);
&$ref;  
&{$ref}(@args);
9 голосов
/ 04 февраля 2010

Если $ref - метод (ожидает $self в качестве первого аргумента), и вы хотите вызвать его ваш $self, синтаксис:

$self->$ref(@args)
6 голосов
/ 04 февраля 2010

Используйте следующее:

$self->$ref();

С этим синтаксисом $ref может быть ссылкой на подпрограмму или даже строку с именем вызываемого метода, например, ,

my $ref = "foo";
$self->$ref();

Имейте в виду, что эти два имеют немного различную семантику в отношении наследования.

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

$self->$ref;  # also flies

В противном случае используйте

$self->$ref($arg1, \%arg2, @others);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...