2011-02-04 13 views
7

Deseo tener un hash que contenga referencias a subfunciones donde pueda llamar esas funciones dependiendo de una variable definida por el usuario, intentaré y daré un ejemplo simplificado de lo que estoy tratando de hacer.Perl Hash de subfunciones

my %colors = (
    vim => setup_vim(), 
    emacs => setup_emacs(), 
) 

$colors{$editor}(arg1, arg2, arg3) 

donde setup_vim() y setup_emacs() habría sub-funciones definidas más adelante en mi archivo y $editor es una variable definida por el usuario (es decir vim o emacs). es posible? No puedo hacer que funcione o encontrar buena información sobre el tema. Gracias.

(Nota tengo que implementa este momento como un interruptor de trabajo, pero creo que un hash como la anterior, sería más fácil para agregar nuevas entradas a mi código existente)

Respuesta

16

Ésta es la sintaxis.

my %colors = (
    vim => \&setup_vim, 
    emacs => \&setup_emacs, 
); 

$colors{$editor}(@args) 

Tenga en cuenta que en realidad se puede crear funciones directamente con

my %colors = (
    vim => sub {...}, 
    emacs => sub {...}, 
); 

Y si usted está familiarizado con los cierres, Perl soporta cierres completos para las variables que han sido declarados léxico, que se puede hacer con mi .

+0

Gracias a ustedes dos, funcionó bien. No estoy seguro de qué cierres me estoy autoaprendiendo Perl al leer Mastering Perl (Foy) y están a 2-3 capítulos de distancia :) –

+0

Los cierres también funcionan en los otros tipos de variables léxicas, no solo en los creados con ' mi' – tchrist

+0

@tchrist: Sí, los cierres funcionan con todas las variables léxicas. Pero las cosas para las que la gente quiere usarlas no ocurren tan obviamente con nuestras variables. Todavía he actualizado mi respuesta. – btilly

3

Tiene que pasar una referencia a la subrutina que desea llamar al hash.

He aquí un ejemplo:

sub myFunc { 
    print join(' - ', @_); 
} 

my %hash = (key => \&myFunc); 
$hash{key}->(1,2,3); 

Con \ & myFunc a obtener los puntos wich de referencia en la función. Importante es dejar el() de distancia. O bien, pasarás a través de una referencia al valor de retorno de la función.

Al llamar a la función por referencia, tiene que eliminarla con el operador ->.

+0

"Al llamar a la función por referencia, tiene que eliminarla con el operador ->". Falso. –

+0

@Chris: Una vez fue cierto. Ahora no lo es. – tchrist

+0

@tchrist - Es cierto. No ha sido así desde que aprendí Perl (¿tres años?). –

Cuestiones relacionadas