2012-06-20 12 views
5


En Perl, que son capaces de llamar a una función por referencia (o nombre) de este modo:Perl: Problemas llamada a subrutinas de referencia utilizando un valor hash

my $functionName = 'someFunction'; 
    &$functionName(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

Lo que estoy tratando de hacer es el uso un valor de un hash, así:

my %hash = (
     functionName => 'someFunction', 
    ); 

    &$hash{functionName}(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

Y el error que consigo es el símbolo mundial "$ almohadilla" requiere el nombre del paquete explícito.

Mi pregunta es: ¿hay una manera correcta de hacer esto sin usar una variable intermedia?
¡Cualquier ayuda en esto sería muy apreciada!

+3

También puede hacer 'my% hash = (function => \ & someFunction)' que no requiere 'no stric t 'refs''. – TLP

+0

@TLP +1, iba a * responder * esto. 'use strict;' saves ** entonces ** mucho problema ... – Dallaylaen

+0

Puedo usar eso, pero agrega un código algo ilegible (por ahora) ... Estoy estableciendo dinámicamente el valor de functionName en tiempo de ejecución y llamando a una función por su nombre. Perl es muy divertido! – Thumper

Respuesta

12

Es solo un problema de precedencia que se puede resolver al no omitir los curlies. Se podría utilizar

&{ $hash{functionName} }() 

O utilizar la sintaxis alternativa:

$hash{functionName}->() 

Como entre los índices, el -> se puede omitir (pero no se omite aquí):

$hash{functionName}() 

Ref: Deferencing Syntax

+0

Guau, esta es la primera pregunta que he hecho aquí, y esperaba una larga espera. Muchas gracias! Terminé usando la primera solución que publicaste. ¡Cosas geniales! Muchas gracias. – Thumper

+0

Además, olvidé mencionar que soy bastante nuevo para Perl (tal vez un mes de experiencia), así que esto realmente ayudará a mi desarrollo profesional. – Thumper

+1

Estoy un poco sorprendido porque la mayoría de las personas consideran que la notación de flecha es más legible, pero ambas son aceptables. – ikegami

Cuestiones relacionadas