Как вызвать метод по имени из значения переменной в perl? - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть имя метода, который я должен вызвать (из другого сценария, кстати) из аргументов - в качестве переменной. В большом упрощении:

$method1 = "hello()";

И я должен написать:

hello();

, но я не знаю, какое имя в # method1.

Как можно Я делаю это?

1 Ответ

4 голосов
/ 24 апреля 2020

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

my $method = "hello";
{
  no strict 'refs';
  &{$method}();  # same as hello()
}

Этот синтаксис &{...}() «разыменовывает» имя подпрограммы и вызывает его .

Если вы вызываете методы для объекта, вы можете пропустить no strict 'refs' часть:

my $method = 'name';
$object->$method();  # same as $object->name

Если вы хотите разрешить только пару подпрограмм, это будет очень лучше хранить их в таблице sh: 1011

my %known_functions = (
  hello => \&hello,  # \& stores a reference to a subroutine 
  bye => \&not_hello,  # added benefit: renaming them
);

# define the functions somewhere
sub hello { ... }
sub not_hello { ... }

# can't access secret methods unless they are added to the hash table
sub secret { ... }

# use a hash lookup and call the method
my $method = 'hello';
$known_functions{$method}();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...