2010-02-04 14 views
6

Sto cercando di capire come far funzionare una funzione di riferimento per un modulo Perl. So come farlo al di fuori di un modulo, ma all'interno di uno? Considerate il codice come questo:Come scrivere un riferimento di funzione in un modulo 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=== 

Guardate le linee 5-6 di cui sopra. Qual è la sintassi corretta per (1) definire il riferimento alla funzione in primo luogo e (2) dereferenziarlo?

risposta

8

Se $ref è un metodo (si aspetta $self come primo argomento) e che si desidera chiamare sul vostra $self, la sintassi è:

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

La cosa importante da notare in questo stile chiamata è che '$ self' è non usato per determinare quale metodo chiamare (come di solito accade quando si chiama un metodo stile OO) - il metodo è determinato esclusivamente da '$ ref', e' $ self' viene semplicemente passato come primo argomento di $ ref. Contrariamente a ciò, se $ ref è semplicemente il nome di un metodo, nel qual caso inizieremo a cercare quel metodo su '$ self' e poi su nell'albero dell'ereditarietà. – Ether

+0

In aumento per essere Randal "one-L" Schwartz! Sìì! –

+8

@Jonathan: non trasformiamo SO [perl] in un gruppo di groupie che sbavano. I fan di Jon Skeet sono già abbastanza cattivi. :/ – Ether

20

TMTOWTDI

Definizione di un riferimento di funzione:

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

Dereferenziare:

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

Usare il seguente:

$self->$ref(); 

Con questa sintassi, $ref può essere un riferimento ad una subroutine o una stringa con il nome del metodo da chiamare, ad esempio ,

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

essere consapevoli del fatto che i due hanno leggermente diverse semantiche rispetto alla eredità.

Quando non sta passando argomenti espliciti, le parentesi sono opzionali:

$self->$ref; # also flies 

In caso contrario, utilizzare

$self->$ref($arg1, \%arg2, @others); 
Problemi correlati