Как я могу элегантно вызвать подпрограмму Perl, имя которой содержится в переменной? - PullRequest
54 голосов
/ 16 декабря 2009

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

&{\&{$action}}();

Работает нормально. Единственное, что мне не нравится, это то, что это ужасно, и каждый раз, когда я делаю это, я чувствую себя обязанным добавить комментарий для следующего разработчика:

# call the sub by the name of $action

Кто-нибудь знает более красивый способ сделать это?


ОБНОВЛЕНИЕ: Идея здесь состояла в том, чтобы избежать необходимости поддерживать таблицу диспетчеризации каждый раз, когда я добавляю новую вызываемую подпрограмму, поскольку я являюсь единственным разработчиком, я не беспокоюсь о том, что другие программисты будут следовать или не следовать «правилам». Пожертвовал немного безопасности для моего удобства. Вместо этого мой диспетчерский модуль проверял бы $ action, чтобы убедиться, что 1) это имя определенной подпрограммы, а не вредоносный код для запуска с eval, и 2) что он не будет запускать подпрограммы с предваряющим подчеркиванием, что будет в соответствии с этим соглашением об именах помечается как внутренняя подпрограмма.

Есть какие-нибудь мысли об этом подходе? Белые подпрограммы в таблице диспетчеризации - это то, что я буду постоянно забывать, и мои клиенты скорее будут ошибаться на стороне «это работает», чем «это злобно безопасно». (очень ограниченное время для разработки приложений)


ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Я думаю, что я все-таки определился с таблицей отправки. Хотя мне было бы любопытно, если бы кто-нибудь, кто читает этот вопрос, когда-либо пытался покончить с одним и тем, как они это сделали, я должен здесь склониться перед коллективной мудростью. Спасибо всем, много замечательных ответов.

Ответы [ 12 ]

0 голосов
/ 23 июля 2014

Я использовал это: у меня это работает.

(\$action)->();

Или вы можете использовать 'do', очень похожий на предыдущие сообщения:

$p = do { \&$conn;}; 
$p->();
0 голосов
/ 16 декабря 2009

Если это только в одной программе, напишите функцию, которая вызывает подпрограмму с использованием имени переменной, и вам нужно только документировать ее / извиниться?

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