2010-02-04 15 views
6

Estoy tratando de averiguar cómo hacer que una referencia de función funcione para un módulo Perl. Sé cómo hacerlo fuera de un módulo, ¿pero dentro de uno? Considere un código como este:¿Cómo escribir una referencia de función en un módulo Perl?

==mymodule.pm== 
1 sub foo { my $self = shift; ... } 
2 sub bar { my $self = shift; ... } 
3 sub zip { 
4 my $self = shift; 
5 my $ref = \&foo; 
6 $self->&$foo(); # what syntax is appropriate? 
7 } 
==eof=== 

Mire las líneas 5-6 anteriores. ¿Cuál es la sintaxis correcta para (1) definir la referencia de función en primer lugar, y (2) desreferenciarla?

Respuesta

8

Si $ref es un método (espera $self como primer argumento) y al que desea llamar en su $self, la sintaxis es:

$self->$ref(@args) 
+1

Lo importante tener en cuenta en este estilo de llamadas es que '$ self' es no se usa para determinar qué método llamar (como suele ser el caso cuando se llama a un método OO-style) - el método se determina únicamente a partir de '$ ref', y' $ self' simplemente se pasa como el primer argumento de $ ref. Contraste esto con si '$ ref' era simplemente el nombre de un método, en cuyo caso comenzaríamos a buscar ese método en' $ self' y luego en el árbol de herencia. – Ether

+0

¡Votado por ser el señor Randal "one-L" Schwartz! ¡Hurra! –

+8

@Jonathan: no convirtamos SO [perl] en un grupo de groupies salivantes ... los fanboys de Jon Skeet ya son lo suficientemente malos. :/ – Ether

20

TMTOWTDI

Definir una referencia de funciones:

$ref = \&subroutine; 
$ref = sub { BLOCK }; 
$ref = "subroutineName"; # or $ref = $scalarSubroutineName 

Desreferenciar:

$ref->(@args); 
&$ref; 
&{$ref}(@args); 
6

utilizar lo siguiente:

$self->$ref(); 

Con esta sintaxis, $ref puede ser una referencia a una subrutina o incluso una cadena con el nombre del método de llamar, por ejemplo ,

my $ref = "foo"; 
$self->$ref(); 

en cuenta que los dos tienen una semántica ligeramente diferente con respecto a la herencia.

Cuando no está de paso argumentos explícitos, los paréntesis son opcionales:

$self->$ref; # also flies 

De lo contrario, utilice

$self->$ref($arg1, \%arg2, @others); 
Cuestiones relacionadas