본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 18. Perlprog - Counter

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 이 게시물은 지금은 폐쇄되어 접속되지 않는 Kim Young Soo(http://hours.interpia98.net/~unisoo/)님의 웹 사이트에 2001년경 게시된 내용을 바탕으로 오늘날 웹 환경에 맞게 내용을 덧붙였습니다.

Perlprog - Counter

Description

 배운 문법을 토대로 프로그램밍을 해보겠습니다. 우선은 간단하게........ 카운터를 만들어 보죠... 여러 홈페이지에 쓰이는 것처럼 예쁜 그림 숫자로 나오는 그런 카운터는 아니구여..... 그냥 숫자만 나오는(텍스트) 그런 카운터를 만들어 보겠습니다.

 하지만 전체적인 홈페이지와 분위기를 그럴싸 하게 한다면, 예쁜 그림으로 한것 보단 심플(?)하고 샤프(?)한 카운터가 될거라고 생각해여~~~


카운터 만들기(Counter)

 우선 카운터 프로그램의 원리를 간단히 설명하겠습니다. 간단하게 생각해요. 만약 'index.html' 파일이 여러분의 홈에 있습니다. 누군가 여러분들의 홈에 들어오면 파일이 열리겠죠? 이 파일이 열릴때 카운터 프로그램이 동작합니다. 그러면서 한 번 열릴때 마다, 카운터를 하나씩 더하는 거죠. 이걸 저장하고, 출력하기만 하면 그만이죠.... 그럼.....

 우선 펄의 경로를 적어 야지요. 경로가 어케 되는지 모르시면 which perl 하시면 나옵니다.

Lesson - 시작

#! /usr/bin/perl

 #! 표시는 perl의 실행 파일이 어디에 있는지를 가리키는 겁니다. 이 라인은 프로그램의 첫줄에 써 주셔야겠죠......

 그리고 카운터의 횟수를 저장할 파일을 정의 합니다. 정의 안하고 나중에 그냥 하셔도 되지만, 작업의 편리성을 위해서....

$count_file = "./data/count.dat";

 변수 $count_file에 './data/count.dat'라는 파일명 경로를 적어 주었습니다. 여기선 'cgi-bin'디렉토리안의 'data'폴더에 쓰겠습니다. 이런 저장 파일들은 'data' 또는 임의의 폴더에 저장, 관리하는 것이 편하겠죠.......

 참고로, 펄의 문장에서 한 문장이 끝날때,``;''표시를 합니다. 이건 C나 그 외의 프로그램과 같죠........

 그 다음, 이 파일을 열어서 카운터의 숫자가 얼마나 되는지 알아 옵니다.

open(FILE, "$count_file") || die "Can't open file\n";
$count = <FILE>;
close(FILE);
					

 처음에 open () 함수를 이용해서 해당 파일을 엽니다. 기억나시죠? FILE이라는 파일 핸들에 $count_file의 파일을 엽니다. 아무런 인수가 없기에 그냥 읽기 모드로 여는 겁니다. 그리고 만약 없다면 ' || ' die 하는 거죠. die는 현재의 프로그램을 종료시킵니다. 다음의 문장을 출력 하고...... 마지막에 쓰인 '\n'는 개행 문자죠. 새로운 라인을 출력합니다. 그리고

$count = <FILE>;

 이 문장은 FILE 의 끝에 도달할 때까지 파일 내용을 $count 변수에 담습니다. 그리고 close() 함수를 이용해서 열었던 파일 핸들을 닫습니다.

 이제 카운터를 읽었으니깐, 카운터의 숫자를 더해야 겠죠?

주의 : 이 프로그램에선 카운터 저장화일의 초기에 관한 부분이 없습니다. 그러므로 처음에 실행하면 "Can't open file"이라면서 프로그램이 종료되죠. 이유는? 위에서 파일을 열때 그냥 읽기 모드로 하였기 때문에 "count.dat"라는 파일을 미리 만들어 두지 않으면 안됩니다. 그러니 간단한 편집기로 아무 내용도 없는 "count.dat"를 "data"폴더에 만들어 둡니다.

처음엔 파일안에 아무 내용이 없습니다. 그래서 아무런 내용이 없으면 $count 를 1로 하고, 만약 어떤 숫자가 써 있으면, $count = $count + 1로 하면 되죠.

if ($count == ' ') # --> $count 가 널문자 라면......
{
	$count = 1; # 1로 초기
}
else # 아니라면(널이 아니라면)
{
	$count += 1; # $count 에 더하기 1
} # --> if ~ else 문 끝.
					

 여기선 if ~ else 문을 사용 했습니다. 그리고 문장의 마지막에 사용된 '#' 기호는 주석입니다.

# 다음의 문장은 그냥 무시 됩니다.

 이제 더했으니 새로운 값을 파일에 저장합니다.

open(FILE, ">$count_file") || die "Can't open file\n";
print FILE $count;
close(FILE);
					

 이번에도 open()함수를 사용해서 열었습니다. 근데 이번엔 ">.." 인수를 사용해서, 덮어쓰기 모드로 파일을 열었습니다. 기존의 내용은 삭제되고 새로이 입력 되는거죠. print FILE...... 이 문장은 파일핸들에 값을 출력하라는 내용입니다.

 카운터에 대한 프로그램은 이게 끝입니다.... 간단하죠? 그렇다고 끝은 아닙니다. 이걸 기존의 HTML 문서에 넣어서 브라우져에 띄워야겠죠....... 띄우는 방법은 SSI를 이요한다 거나, 아니면 프레임을 나누어서 출력되게 하면 됩니다. 그럼 브라우져에 출력하는 부분은 다음과 같습니다.

print "Content-type: text/html\n\n";
print "<html>\n";
print "<body bgcolor = white>\n";
print "<font color=black size=2>$count</font>\n";
print "</body></html>\n";
					

 첫줄의 print "Content-type: text/html\n\n";는 이 문장이 HTML문서라는 것을 알려줍니다.

 그리고 개행문자는 두번을 넣어서 구별해 줍니다. 그 다음은 일반 HTML 문서를 작성하는 것과 동일하죠. 그러면서 어디서든지 변수명을 써 주면 출력이 됩니다. 이 모냥을 좀 더 이뿌게 하면..........

 이것으로 끝입니다. 그러면 파일명을 'count_test.cgi'라고 저장하고, chmod -c 755 count_test.cgi하면 실행모드로 바뀌고, 그냥 콘솔 상에서 'count_test.cgi' 하시면 문장이 뿌려지는 것을 보실수 있습니다. 그 때 $count 가 들어가는 부분을 보시면, 한번 실행할 때 마다 카운터가 하나씩 더해지는 것을 보실수 있습니다.

 그럼 이 프로그램을 브라우저에 띄워야 겠죠? index.html을 아래와 같이 작성합니다.

<html>
	<frameset cols=70% rows=30%>
		<frame src = "top1.html">
		<frame src = "./cgi-bin/count_test.cgi">
	</frameset>
</html>
					

덧붙임: HTML5 버전으로 예제 수정

 본 강좌는 HTML4를 기준으로 작성되어 있고 일부 내용은 현재 쓰이는 웹 표준과 맞지 않아 원하는 결과를 보지 못할 수 있습니다. 아래는 여기서 제시된 예제의 HTML5 수정 버전입니다.

index.html: "count_test.cgi"를 보여주는 소스

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
	</head>
	<body>
		<!-- HTML5에서는 frame 관련 태그가 삭제되고 iframe만 남았습니다. -->
		<!-- 화면 분할에 대해서는 div 등 다른 방법으로 디자인 할 것을 권장합니다. -->
		<iframe src="./cgi-bin/count_test.cgi" width="100%" height="100%" />
	</body>
</html>
							

 이렇게 하시면 두번째 프레임에서 카운터 프로그램이 돌아 갑니다. 그러면서 $count 변수명만 출력이 되죠. 나머지는 태그니깐........

 여러분들의 컴에서 직접 해보세여. 그리고 안되는 점 있으면 게시판에 남겨주시구여..... 이 카운터의 단점이라면...... 이뿐 그래픽이 사용되지 않았다는 거지만, 화면에서 F5키(새로 고침)를 마구 마구 누르면 누를때마다 갱신이 된다는 거죠.

이런게 안되게 할려면.... 조금 더 복잡해지지만, 접속하는 IP를 오늘 날짜와 비교해서 그 IP에 대해서 하루에 한번만 카운터 되게 한다면, 위와 같은 일은 없을 겁니다.

source

 지금까지 프로그램밍한 카운터 파일의 소스입니다.

#! /usr/bin/perl

$count_file = "./data/count.dat";

open (FILE, "$count_file") || die "Can't open file\n";
$count = <FILE>;
close (FILE);

if ($count == ' ')
{
	$count = 1;
}
else
{
	$count += 1;
}

open (FILE, ">$count_file") die || "Can't open file\n";
print FILE $count;
close (FILE);

print "Content-type: text/html\n\n";
print "<html>\n";
print "<body bgcolor = white>\n";
print "<font color=black size=2>$count</font>\n";
print "</body></html>\n";
					

덧붙임: HTML5 버전으로 예제 수정

 본 강좌는 HTML4를 기준으로 작성되어 있고 일부 내용은 현재 쓰이는 웹 표준과 맞지 않아 원하는 결과를 보지 못할 수 있습니다. 아래는 여기서 제시된 예제의 HTML5 수정 버전입니다.

count_test.cgi: "data.txt"를 읽어 정수를 1 증가시키는 소스

print "Content-type: text/html\n\n";
print "<!DOCTYPE html>\n";
print "<html>\n";
print "\t<head>\n"
print "\t\t<meta charset=\"utf-8\" />\n"
print "\t</head>\n"
print "\t<body>\n"
print "\t\t<p>$count</p>\n"
print "\t</body>\n"
print "</html>\n";
							

NOTES

 그럼 다음엔 간단한 방명록을 만들어 보도록 하겠습니다.


이 문서는 Perl 패키지내의 pod2html를 이용하여 만들었습니다. - Kim Young Soo