Как перебрать / разыменовать массив ссылок на подпрограммы в Perl? - PullRequest
4 голосов
/ 17 января 2009

Я пытаюсь выяснить, как перебрать массив ссылок на подпрограммы.

Что не так с этим синтаксисом?

use strict;
use warnings;

sub yell { print "Ahh!\n"; }
sub kick { print "Boot!\n"; }
sub scream { print "Eeek!\n"; }

my @routines = (\&yell, \&kick, \&scream);
foreach my $routine_ref (@routines) {
  my &routine = &{$routine_ref};
  &routine;
}

Заранее спасибо!

Ответы [ 3 ]

10 голосов
/ 17 января 2009

В вашем цикле foreach синтаксическая ошибка приведена ниже:

my &routine;

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

for my $routine_ref (@routines) {
    &{$routine_ref};
}

Как всегда с Perl, «Есть больше, чем один способ сделать это». Например, если какая-либо из этих подпрограмм принимает параметры, вы можете передать их в круглых скобках следующим образом:

for my $routine_ref (@routines) {
  $routine_ref->();
}

Также обратите внимание, что я использовал for вместо foreach, что является лучшей практикой, предложенной Дамианом Конвеем в Perl Best Practices .

4 голосов
/ 17 января 2009
foreach my $routine_ref (@routines) {
        $routine_ref->();
}
0 голосов
/ 17 января 2009

Попробуйте это:

use strict;
use warnings;

sub yell { print "Ahh!\n"; }
sub kick { print "Boot!\n"; }
sub scream { print "Eeek!\n"; }

my @routines = (\&yell, \&kick, \&scream);
foreach my $routine_ref (@routines) {
  &$routine_ref ();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...