2009-02-12 13 views
8

Tengo el siguiente código en mi clase:¿Cómo puedo usar un código ref como devolución de llamada en Perl?


sub new { 
    my $class = shift; 
    my %args = @_; 
    my $self = {}; 
    bless($self, $class); 
    if (exists $args{callback}) { 
     $self->{callback} = $args{callback}; 
    } 
    if (exists $args{dir}) { 
     $self->{dir} = $args{dir}; 
    } 
    return $self; 
} 

sub test { 
    my $self = shift; 
    my $arg = shift; 
    &$self->{callback}($arg); 
} 

y un script que contiene el siguiente código:


use strict; 
use warnings; 
use MyPackage; 

my $callback = sub { 
    my $arg = shift; 
    print $arg; 
}; 

my $obj = MyPackage->new(callback => $callback); 

pero recibo el siguiente error:

Not a CODE reference ... 

¿Qué soy yo ¿desaparecido? Imprimir ref($self->{callback}) muestra CODE. Funciona si uso $self->{callback}->($arg), pero me gustaría utilizar otra forma de invocar el código ref.

+1

¿Por qué quieres otra forma de desreferenciar un código ref? Usa lo que funciona y pasa al siguiente problema. :) –

Respuesta

18

El símbolo & es vinculante solo para $self y no del todo. Usted puede hacer curlies alrededor de la parte que devuelve la referencia:

&{$self->{callback}}($arg); 

Pero el

$self->{callback}->($arg); 

generalmente se considera más limpio, ¿por qué no quiere usarlo?

+0

Mi perl está un poco oxidado. Sabía que me estaba perdiendo algo, y quería saber qué era :). Gracias Adam! – Geo

Cuestiones relacionadas