Я пытаюсь написать некоторый абстрактный код для поиска по списку похожих объектов для первого, чьи атрибуты соответствуют определенным значениям. Чтобы сделать это, мне нужно вызвать кучу методов доступа и проверить все их значения один за другим. Я хотел бы использовать абстракцию, как это:В Perl, как я могу вызвать метод, имя которого у меня есть в строке?
sub verify_attribute {
my ($object, $attribute_method, $wanted_value) = @_;
if (call_method($object, $attribute_method) ~~ $wanted_value) {
return 1;
}
else {
return;
}
}
Тогда я могу петлю через хэш, ключи которого являются аксессорами именами методов и значение которых является значением Я ищу для этих атрибутов. Например, если хэш называется %wanted
, я мог бы использовать такой код, чтобы найти объект, я хочу:
my $found_object;
FINDOBJ: foreach my $obj (@list_of_objects) {
foreach my $accessor (keys %wanted) {
next FINDOBJ unless verify_attribute($obj, $accessor, $wanted{$accessor});
}
# All attrs verified
$found_object = $obj;
last FINDOBJ;
}
Конечно, единственная проблема заключается в том, что call_method
не exsit. Или это? Как я могу вызвать метод, если у меня есть строка, содержащая его имя? Или есть лучшее решение этой проблемы?
Ye ах, я просто подумал об этом несколько секунд назад по проб и ошибок. Круто. –
Я просто использую 'List :: AllUtils'. Или 'Util :: Any qw (: all)'. Но в моем примере кода я стараюсь придерживаться сути. –
Я считаю, что для этого вам нужно отключить проверки строгости с помощью 'no strict'' (не обязательно глобально) - правильно? –