Guardo el nombre de la subrutina que quiero llamar en el tiempo de ejecución en una variable llamada $ action. Luego lo uso para llamar a ese submarino en el momento correcto:¿Cómo puedo llamar elegantemente a una subrutina Perl cuyo nombre se mantiene en una variable?
&{\&{$action}}();
Funciona bien. La única cosa que no me gusta es que es feo y cada vez que lo hago, me siento en deuda con añadir un comentario para que el próximo desarrollador:
# call the sub by the name of $action
Alguien sabe una forma más bonita de hacer esto?
ACTUALIZACIÓN: La idea era evitar tener que mantener una tabla de despacho cada vez que he añadido un nuevo sub exigible, ya que soy el único desarrollador, no estoy preocupado por otros programadores seguir o no seguir el 'reglas'. Sacrificando un poco de seguridad para mi conveniencia. En cambio, mi módulo de despacho verificaría $ action para asegurarme de que 1) es el nombre de una subrutina definida y no un código malicioso para ejecutar con eval, y 2) que no se ejecutará sub-precedido por un guión bajo, que sería marcados como subs internos solamente por esta convención de nomenclatura.
¿Alguna idea sobre este enfoque? Las subrutinas incluidas en la lista blanca en la tabla de envío es algo que siempre olvidaré, y mis clientes preferirían que yo me equivocara del lado de "funciona" que "es muy seguro". (Tiempo muy limitado para desarrollar aplicaciones)
INFORME FINAL DE ACTUALIZACIÓN: Creo que he decidido sobre una mesa de despacho después de todo. Aunque me gustaría saber si alguien que lee esta pregunta alguna vez intentó eliminar una y cómo lo hicieron, debo inclinarme ante la sabiduría colectiva aquí. Gracias a todos, muchas excelentes respuestas.
Date cuenta que cuando se toma una referencia a algo que de inmediato eliminar la referencia, puede saltarse los pasos intermedios. :) –
@brian: generalmente (y definitivamente en este caso), pero vea http://stackoverflow.com/questions/1836178/how-do-i-call-a-function-name-that-is-stored-in -a-hash-in-perl/1836356 # 1836356 para un contraejemplo. :) – Ether
Una tabla de envío también significa que puede 'usar terminante', que generalmente es algo bueno. – OrangeDog