Это на самом деле не рекомендуется, поскольку существуют проблемы безопасности, но вы можете использовать имя подпрограммы для его вызова:
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 => \¬_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}();