2010-01-18 50 views
6

我有一個列表,其中包含我想傳遞給函數的參數。我如何調用該功能?如何將Perl數組引用中的元素作爲獨立參數傳遞給子例程?

例如,假設我有這個功能:

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

而讓我們說我有:

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

我怎麼叫foo無需編寫foo($$args[0], $$args[1], $$args[2])

+2

'APPLY'從哪裏來?這是另一種語言的結構嗎? – daotoad 2010-01-18 19:26:22

+3

APPLY來自LISP http://nostoc.stanford.edu/jeff/llisp/21.html – 2010-01-18 20:32:20

+1

@daotoad來自Lisp,但大多數語言都有它們的等價形式。對於谷歌來說,這是非常困難的事情之一,因爲各種語言爲相同的事情組成了不同的術語。 – 2010-01-18 22:11:43

回答

9

這應做到:

foo(@$args) 

這實際上不是一個apply功能。該語法只是將數組引用解引用回普通數組。 man perlref告訴你更多關於推舉的信息。

+0

你也可以考慮不構建開始的引用,即'@args =(「la」,「de」,「dah」)或者@args = qw(la de dah);'然後傳遞它用'foo(@args)'。這比參考舞蹈更清潔,更直接,但如果你有其他限制(例如數組已經是數據結構的一部分),這不是什麼大問題。 – fennec 2010-01-19 01:01:13

6

試試這個:

foo(@$args); 
10

您通過在前面粘貼@來取消引用數組引用。

foo(@$args); 

或者,如果你想更明確的:

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

或者,如果你有foo參考:

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

很簡單。 foo(@ {$ args})

相關問題