2010-01-18 17 views
6

Ho una lista che contiene argomenti che voglio passare ad una funzione. Come posso chiamare quella funzione?Come posso passare gli elementi in un riferimento di array Perl come argomenti separati a una subroutine?

Per esempio, immaginate ho avuto questa funzione:

sub foo { 
    my ($arg0, $arg1, $arg2) = @_; 
    print "$arg0 $arg1 $arg2\n"; 
} 

E diciamo che ho:

my $args = [ "la", "di", "da" ]; 

Come chiamo foo senza scrivere foo($$args[0], $$args[1], $$args[2])?

+2

Da dove proviene 'APPLY'? È un costrutto in un'altra lingua? – daotoad

+3

APPLY proviene da LISP http://nostoc.stanford.edu/jeff/llisp/21.html –

+1

@daotoad Viene da Lisp ma la maggior parte delle lingue ne ha la forma equivalente. È una di quelle cose che è davvero difficile per Google dato che i vari linguaggi hanno una terminologia diversa per la stessa cosa. –

risposta

9

Questo dovrebbe farlo:

foo(@$args) 

Questo non è in realtà una funzione apply. Quella sintassi semplicemente denota un riferimento di matrice all'array normale. man perlref ti dice di più sui riferimenti.

+0

Si potrebbe anche considerare di non costruire il riferimento per cominciare, cioè '@args = (" la "," de "," dah ")' o anche '@args = qw (la de dah);' e quindi passandolo con 'pippo (@args)'. Questo è più pulito e più diretto rispetto alla danza di riferimento, ma se si hanno altri vincoli (l'array è già parte di una struttura dati, ad esempio) non è un grosso problema. – fennec

6

Prova questo:

foo(@$args); 
10

Si denomina un riferimento di matrice attaccando @ davanti a esso.

foo(@$args); 

Oppure, se si vuole essere più esplicito:

foo(@{ $args }); 
4
foo(@$args); 

Oppure, se si dispone di un riferimento a foo:

my $func = \&foo; 
... 
$func->(@$args); 
2

E 'semplice. foo (@ {$ args})

Problemi correlati