Estoy tratando de escribir un código abstracto para buscar a través de una lista de objetos similares para el primero cuyos atributos coinciden con valores específicos. Para hacer esto, necesito llamar a un grupo de métodos de acceso y verificar todos sus valores uno por uno. Me gustaría utilizar una abstracción de esta manera:En Perl, ¿cómo puedo llamar a un método cuyo nombre tengo en una cadena?
sub verify_attribute {
my ($object, $attribute_method, $wanted_value) = @_;
if (call_method($object, $attribute_method) ~~ $wanted_value) {
return 1;
}
else {
return;
}
}
Entonces puede recorrer un hash cuyas claves son los nombres de métodos de descriptor de acceso y cuyos valores son los valores que estoy buscando para esos atributos. Por ejemplo, si ese hash se llama %wanted
, puede ser que utilice un código como este para encontrar el objeto que quiero:
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;
}
Por supuesto, el único problema es que no call_method
exsit. O lo hace? ¿Cómo puedo llamar a un método si tengo una cadena que contiene su nombre? ¿O hay una mejor solución para todo este problema?
Ye ah, acabo de descifrar esto hace unos pocos siglos por ensayo y error. Guay. –
Solo uso 'List :: AllUtils'. O 'Util :: Any qw (: all)'. Pero en mi código de ejemplo trato de mantenerme en el núcleo. –
Creo que para que esto funcione debes desactivar las verificaciones de rigor con 'no strict;' (no necesariamente globalmente) - ¿correcto? –