2009-08-05 17 views

Respuesta

37

Aquí hay un script completo y operativo que demuestra lo que está preguntando.

sub a { print "Hello World!\n"; } 

sub b { 
    my $func = $_[0]; 
    $func->(); 
} 

b(\&a); 

He aquí una explicación: se toma una referencia a la función a diciendo \&a. En ese punto, tienes una referencia de función; mientras que normalmente una función sería llamado diciendo func() se llama a una función de referencia diciendo $func->()

El acuerdo -> sintaxis con otras referencias también. Por ejemplo, he aquí un ejemplo de hacer frente a la matriz y croquetas de referencias:

sub f { 
    my ($aref, $href) = @_; 
    print "Here's an array reference: $aref->[0]\n"; # prints 5 
    print "Here's a hash ref: $href->{hello}\n";  # prints "world" 
} 

my @a = (5, 6, 7); 
my %h = (hello=>"world", goodbye=>"girl"); 
f(\@a, \%h); 
+1

¿Qué pasaría si estuviera pasando la función como parte de un hash, entonces se vería así? $ args {function} ->(); – Kys

+0

He agregado ejemplos para referencias de matrices y hash. –

+1

Pero ¿y si era esto: f (función => \ &func); luego en la función, f, ¿sería este sub f { $ args {función} ->(); } – Kys

4

Puede tener acceso a subrutinas referencias como \&my_method en Perl, y llamar a esas referencias con $myref->();. Pruebe esto:

perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);' 

¡Buena suerte!

+0

¿Qué pasa si paso la función? como parte de un hash, ¿se vería así? $ args {function} ->(); – Kys

2

Siguiendo con el ejemplo de Eli Courtwright: Si sólo utiliza la primera función una vez, también se podría llamar b con una función anónima, así:

b(sub { print "Hello World\n"; }); 
5

No se puede pasar de una función a otra función directamente. En cambio, pasa una referencia a una función. Para llamar a la función, desreferenciarla (como una REF CODE) usando ->();

sub a { print @_ } 

sub b { 
    my $f = shift; # assuming that $f is a function reference... 
    $f->(@_);  # call it with the remaining arguments 
} 

b(\&a, "hello, world!"); # prints "hello, world!" 

Perl no tiene semántica de paso por nombre, pero puede emularlas usando un hash. El método para llamar a la función es el mismo. Usted lo desreferencia.

sub a { print @_ } 

sub b { 
    my %arg = @_; 
    $arg{function}->(@{$arg{arguments}}); 
} 

b(function => \&a, arguments => ["hello, world!"]); 

ObPerl6: Perl 6 tendrá una semántica pass-by-name.

Cuestiones relacionadas