위의 경우에 매개변수는 받아들일 수 있지만 무시된다. 서브루틴을 호출할 때 매개변수는 @_라는 배열내의 목록으로 전달된다. 이 변수는 절대로 스칼라 변수 $_와는 무관하다. 다음 서브루틴은 서브루틴을 호출할때 전달한 매개변수만 출력하는 서브루틴이다. 또한 이 서브루틴을 호출하는 두개의 예가 이어져 있다.
1: sub printargs {
2: print "@_\n";
3: }
4:
5: &printargs("바보", "영기"); # "바보 영기"를 출력
6: &printargs("개구리", "왕눈이", "투투"); # "개구리 왕눈이 투투"를 출력
다른 일반배열과 마찬가지로 @_의 각 요소는 대괄호에의해 참조할 수 있다.
1: sub printfirsttwo {
2: print "첫번째 인자는 $_[0]이다.\n";
3: print "그리고 $_[1]는 두번째 인자이다.\n";
4: }
다시 강조하지만 참조된 스칼라 $_[0], $_[1]등은 $_와는 전혀 무관하므로 충돌을 걱정필요는 없다.
값의 리턴
서브루틴의 결과는 항상 마지막으로 평가된 값이다. 이 서브루틴은 두개의 입력 매개변수중 큰 값을 리턴한다. 이 것의 예는 다음과 같다:
1: sub maximum
2: {
3: if ($_[0] > $_[1]) {
4: return $_[0];
5: } else {
6: $_[1];
7: }
8: }
9:
10: $biggest = &maximum(37, 24); # 이제 $biggest은 37이다.
앞에서 본 서브루틴들도 임의의 값을 리턴한다. 이 경우에는 1을 리턴한다. 이 것은 서브루틴이 print문을 수행하고 print에 성공하면 결과는 항상 1이기 때문이다.
지역변수
@_ 변수는 현재 서브루틴에서만 사용되는 지역변수이다. 물론 $_[0], $_[1], $_[2]등도 지역변수이다. 다른 변수 역시 지역변수가 될 수 있으며, 입력 매개변수를 변경하려는 경우 아주 유용하다. 다음 서브루틴은 한개의 문자열이 다른 문자열내에 있는지를 조사하는 프로그램이다(공백은 제거). 예는 다음과 같다.