2010-01-18 4 views
6

함수에 전달할 인수가 들어있는 목록이 있습니다. 어떻게 그 함수를 호출 할 수 있습니까?Perl 배열 참조의 요소를 별도의 인수로 서브 루틴에 전달할 수 있습니까?

예를 들어, 나는이 기능을 가지고 상상 :

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

과의 내가 있다고 가정 해 봅시다 : foo($$args[0], $$args[1], $$args[2])를 작성하지 않고

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

가 어떻게 foo 부릅니까?

+2

여기서'APPLY'는 어디에서 왔습니까? 이것은 다른 언어로 구성되어 있습니까? – daotoad

+3

APPLY는 LISP에서 제공합니다. http://nostoc.stanford.edu/jeff/llisp/21.html –

+1

@daotoad Lisp에서 제공하지만 대부분의 언어는 이에 상응하는 형식을 가지고 있습니다. 다양한 언어가 동일한 용어에 대해 서로 다른 용어를 사용하기 때문에 Google에있어 어려운 점 중 하나입니다. –

답변

9

이 그것을 수행해야합니다 실제로 apply 함수가 아닙니다

foo(@$args) 

. 이 구문은 배열 참조를 다시 일반 배열로 역 참조합니다. man perlref은 referecences에 대해 자세히 알려줍니다.

+0

'@args = ("la", "de", "dah")'또는'@args = qw (la de dah);와 같이 시작하도록 참조를 구성하지 않은 다음 고려해 볼 수도 있습니다 'foo (@args)'를 사용하십시오. 이것은 참조 댄스를 수행하는 것보다 더 깔끔하고 간단합니다. 다른 제약 조건 (어레이가 이미 데이터 구조의 일부분 인 경우)이 큰 문제는 아닙니다. – fennec

6

이 시도 :

foo(@$args); 
10

배열 참조 앞에 @을 붙임으로써 참조를 참조 해제합니다. 좀 더 명시 할 경우

foo(@$args); 

는 또는 : 당신이 foo에 대한 참조가있는 경우

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

또는 :

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

그것은 간단합니다. foo (@ {$ args})

관련 문제