Я ищу так часто, что я нашел полезным отобразить ключ подчеркивания для удаления поискового выделения:
nnoremap <silent> _ :nohl<CR>
Foo->${\$hash{func}};
Но для ясности я бы, вероятно, все же записал это как:
my $method = $hash{func};
Foo->$method;
Есть ли причина, по которой вы храните имена подпрограмм вместо ссылок на код?
например,
use strict; use warnings;
package Foo;
sub foo { print "in foo()\n" }
package main;
my %hash = (func => \&Foo::foo);
$hash{func}->();
Вы не будете передавать имя класса, но если это важно для вас, вы можете использовать что-то вроде
my %hash = ( func => sub { return Foo->foo(@_) } );
Вы пробовали использовать метод UNIVERSAL can ? Вы должны иметь возможность реализовать что-то вроде этого:
## untested
if ( my $code = $object->can( $hash{func} ) ) {
$object->$code();
}
Я сделал бесполезный однострочный пример, чтобы продемонстрировать:
perl -MData::Dumper -le 'my %h = ( f => "Dump" ); my $o = Data::Dumper->new( [qw/1 2 3/] ); my $ref = $o->can( $h{f} ); print $o->$ref()'