2009-02-12 5 views
8

Ich habe den folgenden Code in meiner Klasse:Wie kann ich einen Code-Ref als Rückruf in Perl verwenden?


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); 
} 

und ein Skript den folgenden Code enthält:


use strict; 
use warnings; 
use MyPackage; 

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

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

aber ich erhalte den folgenden Fehler:

Not a CODE reference ... 

Was ich bin fehlt? Drucken ref($self->{callback}) zeigt CODE. Es funktioniert, wenn ich $self->{callback}->($arg) benutze, aber ich möchte eine andere Weise verwenden, den Code ref. Aufzurufen.

+1

Warum möchten Sie eine andere Möglichkeit, einen Code ref dereferenzieren? Verwenden Sie, was funktioniert und gehen Sie zum nächsten Problem über. :) –

Antwort

18

Das Ampersand ist nur an $self verbindlich und nicht die ganze Sache. Sie können rund um den Teil curlies tun, die den Verweis zurückgibt:

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

Aber die

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

wird allgemein als Reiniger, warum Sie nicht wollen, es zu benutzen?

+0

Mein Perl ist irgendwie rostig. Ich wusste, dass ich etwas vermisste, und ich wollte herausfinden, was das war :). Danke Adam! – Geo

Verwandte Themen