Я думаю, все зависит от того, что вы пытаетесь выполнить. Это выглядит как XY Problem
Более обычным подходом было бы, например,
#!/usr/bin/env perl
use strict;
use warnings;
package MyObject;
sub new {
my ($class, %args) = @_;
my $self = {};
$self->{args} = \%args;
bless $self, $class;
return $self;
}
sub get_value {
my ($self, $attribute) = @_;
return $self -> {args} -> {$attribute};
}
package main;
my $object = 'MyObject'->new(test => 'frobnicated', foo=>'bar');
print $object -> get_value('test');
И обрабатывать динамический бит в самом методе, например.
Однако, если вы хотите, чтобы «найти» подпрограмму можно использовать метод can
получить coderef:
my $methodname = 'get_value';
if (my $coderef = $object -> can($methodname)) {
print $coderef -> ($object,'foo');
}
я не уверен, this'd в целом хорошая вещь, чтобы делать хотя, поскольку это могло стать довольно грязным. Я думаю, что этот подход менее вероятен для случайного разрыва, чем для eval.
Однако ваш оригинальный подход делает работы:
my $value = eval '$object->$methodname("foo")';
print $value,"\n";
Я думаю, что это может быть, что ваш саб erroring - вы пробовали проверять [email protected]
, который является кодом возврата eval
?
Что вы на самом деле пытаетесь сделать здесь? Почему вы пытаетесь создать динамическое имя sub? Более распространенным подходом будет '$ object -> get_value ($ some_attribute_name)' или что-то подобное. Это похоже на проблему [XY] (http: //meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Sobrique
Это должно сработать. Вы не показываете свой настоящий код. – simbabque
Хорошо пятнистый. Я отправился на поиски проблемы, прежде чем понял, что ее нет. – Sobrique