날짜: 1996-04-20 | 글쓴이: 도아 | 5856 번 | 프린트 | 메일로보내기

제 20강 - 서브루틴


다른 우수한 프로그래밍 언어처럼 펄도 서브루틴이라 부르는 사용자 함수를 정의할 수 있다. 이들은 프로그램 어디에 위치해도되지만 프로그램의 시작부분이나 끝부분에 두는 것이 아마 최선일 것이다. 요약 선언

sub NAME { 
	STATEMENTS; 
}
NAME
서브루틴의 이름
STATEMENTS
서브루틴에서 수행할 문장
매개변수
명시적으로 표시하지 않으며, @_를 이용해서 참조.
리턴값
return을 이용해서 명시적으로 리턴하거나 마지막으로 평가된 값
변수
local, my와 같은 범위 변경자를 이용해서 명식적으로 표시하지 않는한 전역변수로 사용됨
호출

&NAME;
&NAME($var1, $var2);
&NAME(*var);
NAME();
NAME($var1, $var2);
NAME(*var);
&NAME
서브루틴 호출
&NAME($var1, $var2)
매개변수($var1, $var2)로 서브루틴을 호출
&NAME(*var)
리턴 받을 변수를 지정해서 호출. *var($var, @var, %var)로 값을 리턴 받음.
NAME(), NAME($var1, $var2), NAME(*var)
& 기호를 생략하고 호출할 수 있다.

주의: *var을 이용하기 위해 서브루틴은 다음과 같은 형식으로 정의되어야 한다.

sub NAME {
	local(*in) = @_;
	STATEMENTS;
}
설명

서브루틴은 전달 해주어야하는 매개변수와 무관하게 다음과 같은 형식을 갖는다.

1: sub mysubroutine
2: {
3:     print "그리 흥미있는 루틴은 아니군.\n";
4:     print "하지만 매번 같은 일을 하지.\n";
5: }

다음의 것 모두 이 서브루틴을 호출하는데 사용된다. 서브루틴은 서브루틴의 이름 앞에 &를 붙여 호출하는 것에 주의한다.

&mysubroutine;		# 서브루틴 호출
&mysubroutine($_);	# 매개변수로 서브루틴 호출
&mysubroutine(1+2, $_);	# 두개의 매개변수로 서브루틴 호출
매개변수

위의 경우에 매개변수는 받아들일 수 있지만 무시된다. 서브루틴을 호출할 때 매개변수는 @_라는 배열내의 목록으로 전달된다. 이 변수는 절대로 스칼라 변수 $_와는 무관하다. 다음 서브루틴은 서브루틴을 호출할때 전달한 매개변수만 출력하는 서브루틴이다. 또한 이 서브루틴을 호출하는 두개의 예가 이어져 있다.

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]등도 지역변수이다. 다른 변수 역시 지역변수가 될 수 있으며, 입력 매개변수를 변경하려는 경우 아주 유용하다. 다음 서브루틴은 한개의 문자열이 다른 문자열내에 있는지를 조사하는 프로그램이다(공백은 제거). 예는 다음과 같다.

 1: sub inside
 2: {
 3:     local($a, $b);		# 지역변수 선언
 4:     ($a, $b) = ($_[0], $_[1]);	# 값 할당
 5:     $a =~ s/ //g;		# 지역변수에서 공백 제거
 6:     $b =~ s/ //g;            
 7:     ($a =~ /$b/ || $b =~ /$a/);	# $a내에 $b가 있거나
 8:                     # $b내에 $a가 있는가?
 9: }
10:
11: &inside("이게 책 임감?", "책임감");	# 참

처음 두행은 다음과 같이 교체함으로서 보다 깔끔하게 만들 수 있다.

local($a, $b) = ($_[0], $_[1]);

local과 비슷한 기능을 하는 my라는 새로운 연산자가 도입되었다. my의 기능은 local과 완전히 동일하며 다만 local에 비해 조금 빠르다. 연습 -방명록

guest.cgi를 다음과 같은 서브루틴으로 작성하라.

&read_parse;	# 입력디코딩 루팅
&print_header;	# content-type출력. mime type은 인자로 지정
&html_top;	# HTML 헤드부 출력. 타이틀은 인자로 지정
&html_bot;	# HTML End부 출력.
&cgi_die;	# 디버깅 루틴.

&cgi_die 루틴은 다음과 비슷할 것이다.

sub cgi_die {
	my($title, $subject) = @_;

	print <<CGIDie;
content-type: text/html

<html>
<head>
<title>$title</title>
</head>
<body>
<p>$subject</p>
</body>
</html>
CGIDie

	exit;
}


다음글: 제 21강 - 라이브러리 (4984)1996-04-21
이전글: 제 19강 - CGI 입력 디코딩 (7216)1996-04-19

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.