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

제 21강 - 라이브러리


라이브러리는 자주 사용되는 서브루틴을 모아놓은 것이다. 펄에서는 세가지 형태의 라이브러리를 제공한다.

첫번째가 가장 일반적으로 사용되는 라이브러리로서 서브루틴에대한 정의를 열거해 놓은 형태의 라이브러리이다.

두번째가 라이브러리의 서브루틴에서 지역변수의 정의를유지하도록 변경한 패키지이다.

마지막으로 세번째는 모듈이다. 모듈은 패키지에 개체의 개념을 도입한 것으로서 마치 개체를 참조하듯 펄의 변수와 함수를 참조할 수 있도록 한 것이다.

패키지와 모듈에 대한 논의는 다음으로 미루고 이 절에서는 라이브러리에 대해 다루겠다. 요약

라이브러리는 서브루틴의 집합으로 다음과 같은 형식으로 별도의 파일에 서브루틴을 두면된다.

sub SUBROUTINE1 {
	STATEMENT;
}

sub SUBROUTINE2 {
	STATEMENT;
}
.
.
.
sub SUBROUTINEn {
	STATEMENT;
}
1;
SUBROUTINE1~n
서브루틴들의 이름
STATEMENT
서브루틴에서 수행되어야할 문장
1;
라이브러리의 마지막 리턴값으로 반드시 필요하다.
설명

 1 : $locked = 'N';
 2 : 
 3 : sub print_header {
 4 : my ($header)=<<Header;
 5 : Content-Type: text/html
 6 : 
 7 : Header
 8 : 	return $header;
 9 : }
10 : 
11 : sub html_top {
12 : my($title, $style, $class, $jscode, $redirect) = @_;
13 : 
14 : my($top) =<<Top;
15 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
16 : <HTML>
17 : <HEAD>
18 : <TITLE>$title</TITLE>
19 : 
20 : <LINK REV="made" HREF="mailto:artech\@syscon.soongsil.ac.kr">
21 : <LINK REL="StyleSheet" HREF="$style">
22 : <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=EUC-KR">
23 : <META NAME="author" content="Jae-Geun, Kim">
24 : $redirect
25 : $jscode
26 : </HEAD>
27 : 
28 : <BODY class=$class>
29 : Top
30 : 	return $top;
31 : }
32 : 
33 : sub html_bot {
34 : 	my($bot) =<<Bot;
35 : </body>
36 : </html>
37 : Bot
38 : 	return $bot;
39 : }
40 : 
41 : sub print_title {
42 : my(@message) = @_;
43 : $top =<<Top;
44 : <H2 class=h3> $message[0] </H2>
45 : <H2 class=ban> $message[1] </H2>
46 : <hr noshade size=4>
47 : 
48 : Top
49 : }
50 : 
51 : sub read_parse {
52 : 	my($buffer, $pair);
53 : 
54 : 	# Query String을 읽습니다.
55 : 
56 : 	if($ENV{'REQUEST_METHOD'} eq 'GET' || $ENV{'REQUEST_METHOD'} eq 'HEAD') {
57 : 		$buffer = $ENV{'QUERY_STRING'};
58 : 	}elsif($ENV{'REQUEST_METHOD'} eq 'POST') {
59 : 	    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
60 : 	}else {
61 : 		print "Off Line Mode - Type: name1=value1&name2=value2\n";
62 : 		print "Enter: ";
63 : 		chop($buffer = <STDIN>);
64 : 	}
65 : 
66 : 	# 이름-값으로 구성된 form 데이타를 분리합니다.
67 : 	my(@pairs) = split(/&/, $buffer);
68 : 
69 : 	foreach $pair (@pairs) {
70 : 		my($name, $value) = split(/=/, $pair);
71 : 
72 : 		# +를 공백으로, %HH형식을 원래의 값으로 되돌립니다.
73 : 		$value =~ tr/+/ /;
74 : 		$value =~ s/%(..)/pack("C", hex())/eg;
75 : 		$value =~ s/<!--(.|\n)*-->//g;
76 : 
77 : 		# form의 데이타를 연관배열에 저장합니다.
78 : 		$FORM{$name} = $value;
79 : 	}
80 : 	return %FORM;
81 : }
82 : 1;

앞에서 작성한 방명록에대한 라이브러리의 예이다. 위에서 알 수 있듯이 라이브러리를 작성하기 위해서는 앞서 작성한 서브루틴을 별도의 파일에 저장하면 된다.

한가지 주의할 것은 라이브러리는 서브루틴의 정의를 모아놓은 것에 불과하다. 따라서 위의 라이브러리를 가져오게 되면 유효코드는 하나도 존재하지 않는 파일을 블러오게된다.

이것을 막기위해 서브루틴의 제일마지막 행에 유효코드를 리턴할 수 있도록

82 : 1;

코드를 삽입했다. 라이브러리 블러오기 사용형식

require './mylib.pl';

라이브러리를 참조하는 프로그램과 라이브러리가 같은 디렉토리에 있는 경우 명시적으로 현재 디렉토리임을 표시해야 한다.

주의: 현재 디렉토리임을 명시적으로 표시하지 않는 경우 펄은 펄의 표준 라이브러리 경로에서 라이브러리를 찾게된다.

require '/home/artech/public_html/mylib.pl';

라이브러리를 참조하는 프로그램과 라이브러리가 다른 디렉토리에 있는 경우 해당 디렉토리의 절대 경로를 사용해서 라이브러리를 참조한다.

push(@INC, '/home/artech/public_html');
require 'mylib.pl';

참조하는 라이브러리가 어디에 있든 라이브러리를 펄의 표준 라이브러리 경로에 등록하고 해당 라이브러리를 참조한다.

주의1: push대신에 unshift를 사용해도 된다. 이 경우 자신이 작성한 라이브러리가 표준 라이브러리보다 먼저 참조된다.

주의2: require 'mylib.pl'에서 보듯 현재 디렉토리임을 표시하는 "./"가 생략되었다. 라이브러리 작성시 유의사항

이렇게 작성한 라이브러리는 언제, 어디서, 누가 사용할지 알 수 없으므로 다음의 규칙을 반드시 지켜야 한다. 지역변수 사용

펄은 특별한 언급이 없으면 항상 전역변수를 사용하므로 라이브러리에서 얘기치 않게 Main 루틴의 변수를 변경할 수 있다. 따라서 넘겨받은 인자를 포함, 서브루틴에서 사용하는 모든 변수는 지역변수로 선언해야 한다.

12 : my($title, $style, $class, $jscode, $redirect) = @_;
인자의 전달

펄에서 인자의 전달은 @_를 통해이루어 진다. @_를 바로 참조하기 보다는 다음과 같이 전달 받은 인자를 지역변수로 변환하고 이 지역 변수를 서브루틴에서 사용한다.

12 : my($title, $style, $class, $jscode, $redirect) = @_;

&sub(*FORM)과 같은 형식으로 리턴될 변수를 호출시 지정할 수 있게 하기위해서는 다음과 같은 형식으로 지역변수를 선언해야 한다.

sub NAME {
	local(*in) = @_;
	STATEMENTS;
	return *in;
}
값의 리턴

펄에서 값을 리턴하는 방법은 앞서 얘기했듯 두가지가 존재한다. 라이브러리를 작성하는 경우에는 가급적 명시적으로 값을 리턴해야 한다. 연습 - 방명록

앞서 작성한 모든 서브루틴을 mylib.pl이라는 라이브러리로 변환하라.



다음글: 제 22강 - CGI용 라이브러리(cgi-lib.pl) (6244)1996-04-22
이전글: 제 20강 - 서브루틴 (5856)1996-04-20

세상사는 이야기

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


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