Comment puis-je élégamment appeler un sous-programme Perl dont le nom est tenu dans une variable?

Je garde le nom de la sous-routine, je tiens à appeler à l'exécution dans une variable appelée $l'action. Puis-je l'utiliser pour l'appel de sous au bon moment:

&{\&{$action}}();

Fonctionne très bien. La seule chose que je n'aime pas, c'est que c'est laid, et à chaque fois que je le fais, je me sens redevable à ajouter un commentaire pour la prochaine développeur:

# call the sub by the name of $action

Quelqu'un connais une jolie façon de faire cela?


Mise à JOUR: L'idée ici était d'éviter d'avoir à maintenir un envoi de la table chaque fois, j'ai ajouté un nouveau appelable sous, depuis que je suis le seul développeur, je ne suis pas inquiet au sujet d'autres programmeurs suit ou ne suit pas les "règles". Sacrifier un peu de sécurité pour mon confort. Au lieu de mon expédition module de vérification de $action pour s'assurer que 1) c'est le nom d'une sous-routine et de ne pas l'exécution de code malveillant avec eval, et 2) qu'il ne serait pas exécuter n'importe quel sous préfacé par un trait de soulignement, qui devrait être marquée comme interne uniquement des sous-marins par cette convention de nommage.

Toute réflexion sur cette approche? Une liste blanche des sous-programmes dans l'envoi de la table est quelque chose que j'oublierai tout le temps, et mes clients serait plutôt me pencher du côté de "ça marche" que "c'est presque sûr". (très peu de temps pour développer des applications)


Dernière mise à JOUR: je pense que j'ai décidé sur un envoi de la table, après tout. Bien que je serais curieux de savoir si quelqu'un qui lit cette question n'a jamais essayé de les faire disparaître, et comment ils l'ont fait, j'ai à vous incliner devant la sagesse collective ici. Merci à tous, beaucoup de grandes réponses.

  • Réaliser que lorsque vous prenez une référence à quelque chose d'immédiatement déréférencement d'elle, vous pouvez sauter le moyen étapes de. 🙂
  • généralement (et certainement dans ce cas), mais voir stackoverflow.com/questions/1836178/... pour un contre-exemple. 🙂
  • Une expédition table signifie également que vous pouvez use strict, qui est généralement une bonne chose.
InformationsquelleAutor Marcus | 2009-12-16