2009-02-12 9 views
8

Ho il seguente codice nella mia classe:Come posso usare un codice ref come callback in 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); 
} 

e uno script che contiene il seguente codice:


use strict; 
use warnings; 
use MyPackage; 

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

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

ma ricevo il seguente errore:

Not a CODE reference ... 

Che cosa sono io mancante? La stampa ref($self->{callback}) mostra CODE. Funziona se uso $self->{callback}->($arg), ma mi piacerebbe usare un altro modo di richiamare il codice ref.

+1

Perché vuoi un altro modo per rimuovere un riferimento al codice? Usa ciò che funziona e passa al prossimo problema. :) –

risposta

18

La e commerciale è vincolante solo per $self e non il tutto. Si può fare curlies intorno alla parte che restituisce il riferimento:

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

Ma la

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

è generalmente considerato più pulito, perché non si desidera utilizzarlo?

+0

Il mio perl è un po 'arrugginito. Sapevo che mi mancava qualcosa, e volevo scoprire cosa fosse :). Grazie Adam! – Geo