2010-01-18 3 views
6

Ich habe eine Liste, die Argumente enthält, die ich an eine Funktion übergeben möchte. Wie rufe ich diese Funktion an?Wie kann ich die Elemente in einer Perl-Array-Referenz als separate Argumente an eine Subroutine übergeben?

Zum Beispiel stelle ich mir diese Funktion hatte:

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

Und lassen Sie uns sagen, ich habe:

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

Wie rufe ich foo ohne foo($$args[0], $$args[1], $$args[2]) zu schreiben?

+2

Woher kommt der 'APPLY'? Ist das ein Konstrukt in einer anderen Sprache? – daotoad

+3

APPLY kommt von LISP http://nostoc.stanford.edu/jeff/llisp/21.html –

+1

@daotoad Kommt von Lisp aber die meisten Sprachen haben ihre äquivalente Form davon. Es ist eines dieser Dinge, für die Google wirklich schwer ist, da verschiedene Sprachen unterschiedliche Terminologien für dasselbe Thema enthalten. –

Antwort

9

Dies sollte es tun:

foo(@$args) 

Das ist nicht wirklich eine apply Funktion ist. Diese Syntax dereferenziert lediglich einen Array-Bezug auf ein einfaches Array. man perlref erzählt Ihnen mehr über Referenzen.

+0

Sie könnten auch erwägen, die Referenz nicht zu konstruieren, zB '@args = (" la "," de "," dah ")" oder gar "@args = qw (la de dah);' und dann weiterleiten mit 'foo (@args)'. Dies ist sauberer und einfacher als der Referenztanz, wenn Sie jedoch andere Einschränkungen haben (das Array ist zum Beispiel bereits Teil einer Datenstruktur), ist das keine große Sache. – fennec

6

Try this:

foo(@$args); 
10

Sie dereferenzieren eine Array-Referenz, indem Sie @ davor stecken.

foo(@$args); 

Oder wenn Sie mehr explizit sein wollen:

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

Oder, wenn Sie einen Verweis auf foo haben:

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

Es ist ganz einfach. foo (@ {$ args})