2013-01-25 2 views
-1

여기 내 문제가 있습니다 : 동적 인수가있는 루틴을 사용하고 싶습니다.배열 내에서 인수 전달 Perl

dynamic_sub($firstMandatoryArgment, "second argument", $thirdArgument); 

내가 인수의 수와 dynamic_sub 호출 할 수 있습니다 (하지만 일부는 필수) : 예를 들어, 여기 내 하위입니다. 내 프로그램에서 인수의 수는 상황에 달려있다. 그래서 그런 걸 쓰고 싶은 :

my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...); 

dynamic_sub(@args); 

것은 내가 dynamic_sub()를 다시 작성할 수 없습니다입니다, 그래서 함께) (dynamic_sub를 호출 한 후 배열로 내 인수를 넣어하는 방법을 찾아야 내 주장의 배열. 물론 @args는 배열이 아니라 많은 인수로 해석되어야합니다.)

미리 감사드립니다!

+7

* 인수를 배열에 넣었습니다. 뭐가 문제 야? – TLP

+2

모든 인수가 스칼라 인 경우 문제가 없습니다. 하나의 매개 변수가 배열 인 경우 메서드에서 인수를 로컬 변수로 '이동'할 때주의해야합니다. 그런 다음 참조를 사용할 수 있습니다. 그러나 당신의 질문은 무엇입니까 ?????? –

+0

잘 작동합니다. 나는 오타를 만들었습니다 : ( – user2011117

답변

4

Perl에서 서브 루틴은 내부적으로 배열 @_에 할당 된 목록의 인수를 사용합니다. 따라서 대부분의 경우 배열을 사용하여 하위를 호출하거나 값 목록을 사용하여 하위를 호출하는 것은 동일한 작업입니다.

서브 루틴 원형 사용하면 하나 개의 예외이다

sub without_prototypes { say "@_" } 
sub with_prototypes ($) { say "@_" } 

my @args = 1 .. 5; 

without_prototypes(@args); # @args is used in list context, prints "1 2 3 4 5\n". 
with_prototypes(@args); # @args is used in scalar context, prints "5\n" (length). 
&with_prototypes(@args); # the & disables prototypes; prints "1 2 3 4 5\n". 
1

인수로 전달 될 수있는 유일한 방법은 따라서

my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...); 
dynamic_sub(@args); 

스칼라들의 목록이다 똑같다 as

my @args = ($firstMandatoryArgment, "second argument", $thirdArgument, ...); 
dynamic_sub($args[0], $args[1], $args[2], ...); 

sub (어리석게) 프로토 타입을 사용하여 프로토 타입을 재정의 할 수 있습니다. & :

&dynamic_sub(@args);