Perl Хэш подфункций - PullRequest
       3

Perl Хэш подфункций

8 голосов
/ 04 февраля 2011

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

my %colors = (
    vim => setup_vim(),
    emacs => setup_emacs(),
)

$colors{$editor}(arg1, arg2, arg3)

, где setup_vim() и setup_emacs() будут подфункциями, определенными позже в моем файле, а $editor - определяемая пользователем переменная (т.е. vim или emacs). Это возможно? Я не могу заставить его работать, или найти хорошую информацию по этому вопросу. Спасибо.

(Обратите внимание, что он реализован прямо сейчас как работающий Switch, но я думаю, что хеш, подобный приведенному выше, облегчит добавление новых записей в мой существующий код)

Ответы [ 2 ]

17 голосов
/ 04 февраля 2011

Вот синтаксис.

my %colors = (
    vim => \&setup_vim,
    emacs => \&setup_emacs,
);

$colors{$editor}(@args)

Обратите внимание, что на самом деле вы можете создавать функции непосредственно с

my %colors = (
    vim => sub {...},
    emacs => sub {...},
);

И если вы знакомы с замыканиями, Perl поддерживает полные замыкания для переменныхкоторые были объявлены лексически, что вы можете сделать с моим.

3 голосов
/ 04 февраля 2011

Вы должны передать ссылку на подпрограмму, которую хотите вызвать, в хеш.

Вот пример:

sub myFunc {
   print join(' - ', @_);
}

my %hash = ( key => \&myFunc );
$hash{key}->(1,2,3);

С \ & myFunc вы получаете ссылку, которая указывает на функцию. Важно, чтобы оставить () прочь. В противном случае вы должны передать ссылку на возвращаемое значение функции.

При вызове функции по ссылке необходимо разыменовать ее с помощью оператора ->.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...