본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 03. Perllang - 펄 기초 문법 1

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

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

Perllang - 펄 기초 문법 1

Description

데이터 타입, 특수 변수...


Perl...

 Perl - 1986년 Unix 프로그래머인 Larry Wall이라는 사람이 자신이 맡은 업무를 보다 쉽게 처리할려고 하는 과정에서, 자신의 일을 해결할수 있는 가장 간결하고 적합한 유틸리티를 만들게 되었구요, 그래서 그는 새로운 프로그래밍 언어를 발명하게 되었고, 그후 펄이란 이름으로 빠르게 번져나갔다고 합니다.

 펄의 'p'가 대문자인지 소문자인지에 대해서 Larry Wall은 중요하지 않다고 말했다는군요.

 여기선 Perl 5를 기준으로 합니다.


Date Type

펄의 데이터 타입은 스칼라(scalars), 배열(arrays), 결합형 배열(associative arrays) 이렇게 세가지가 있습니다. 그리고, 모든 변수명을 대소문자를 구별합니다. $temp와 $Temp는 서로 다른 변수가 됩니다.

스칼라(Scalars)

 펄은 다른 언어와는 달리 모든 수와 문자열을 이 스칼라로 표현합니다. 스칼라 변수명은 '$'표로 시작합니다.

$a = 2; # - 숫자
$b = "test"; # - 문자
$temp = "My name is Soo"; # - 문자열

배열(Array)

 스칼라의 집합을 배열이라 하며, '@'표시로 시작합니다. 다음과 같이 괄호안에 ',(쉼표)'로 각 변수는 구별됩니다.

@name = ("chanho", "unicorn", "jongbum", "Hongsun");
@id = (1234, "unisoo", 0987);

 또한 배열안에 또 다른 배열이 정의 될수 있습니다.

@a = (1, 2);
@b = (3, 4);
@c = (@a, @b);

 이렇게 하면 @c에는 1, 2, 3, 4의 값을 가지게 됩니다.

 여기서 주의할 것은 배열을 스칼라에 할당 했을 경우입니다.

@a = (1, 2);
@b = @a; # <-- @b는 당연히 1, 2의 값을 가지게 됩니다.
$c = @a; # <-- $c는 1, 2 의 값이 아닌 2의 값을 가지게 됩니다.
# $c는 array내의 값을 가지는 것이 아니라, array 내의 값들의 개수를 가지는 거죠.

 만일 배열 내의 임의의 값에 접근하고자 할 경우는,

@a = ("name", "school", 4, "Korea");
$temp1 = $a[0] # <-- name
$temp2 = $a[3] # <-- Korea 의 값을 가지게 되죠.

 배열은 0번째부터 값을 가지게 됩니다. 그러니깐 위 경우는 값이 4개니깐 $a[0]은 'name'이 되고, $a[1]은 'school'이 되고, $a[2]는 '4'가 되고, $a[3]은 'Korea'의 값을 가지게 됩니다.

결합형 배열(Associative Arrays)

 이 결합형 배열은 위의 배열과는 조금 다른 모습을 가집니다. 위의 배열은 그냥 값만 가지는것에 비해, 결합형 배열은 키(key)와 이 키에 대응하는 값을 가집니다. 결합형 배열은 '%'표시로 시작되며, 다음과 같습니다.

%animal = ("name", "ppoby", "number", "two", "race", "jabjong");

 이렇게 표현되며, 배열의 각 요소들에 접근하기 위해서는

$temp = $animal{"name"}; # <-- 'ppoby'
$temp_1 = $animal{"number"}; # <-- 'two'
$temp_2 = $animal{"race"}; # <-- 'jabjong' 의 값이 할당됩니다.

 즉, 위의 예에서 'name은 ppoby를 number는 two를 race는 jabjong' 과 쌍을 이루게 됩니다. 다시 말해서 위의 배열에서 키는 'name, number, race'가 되고, 각 키의 값으로는 'ppoby, two, jabjong'이 되는 것입니다.

 펄의 테이터 타입에 대해선 이정도로 하겠습니다. 그리고 다음으로 자주 쓰이는 특수 변수에 대해서 말씀드리고, CGI 첫걸음 1을 마치겠습니다.

덧붙임: 변수 유형에 따른 Perl의 변수 이름 정리

기호유형특징
$스칼라 변수1개의 값만을 가질 수 있음.
대입: $이름 = 값;
참조: 값 = $이름;
@배열여러개의 값을 가질 수 있음.
초기화: @이름 = (원소1, 원소2, ...);
배열 합치기: @이름 = (@배열1, @배열2, ...);
원소 대입: $이름[인덱스] = 값
원소 참조: 원소 = $이름[인덱스]
(단, 인덱스는 0번부터 시작)
%결합형 배열(C++/Java의 Map, C#의 Dictionary에 해당)짝수번째 원소 = 키, 홀수번째 원소 = 값
초기화: %이름 = (키1, 값1, 키2, 값2, ..., ...)
원소 대입: $이름{키} = 값;
원소 참조 값 = $이름{키};

특수 변수(Special Variables)

 여기서는 펄에서 대단히 많이 쓰이는 변수 몇가지만 소개하기로 하구여, 나머지 변수들은 나중에 그때그때 마다 말씀드리겠습니다.

 전체적인 것에 대해서는 나중에 정리해서 올리겠습니다.

환경 변수(Environment Variables) - %ENV

 이 변수는 환경 변수를 가지고 있는 결합 배열입니다. 이 변수를 이용해서 아주 쉽게 환경 변수의 내용을 얻을 수 있습니다. 폼으로 부터 보내어진 데이터나, 접속한 사용자의 브라우저 정보, 클라이언트의 IP 주소, 자신의 서버가 사용하고 있는 웹 프로토콜의 버전 등 쉽게 그 정보를 얻을 수 있습니다.

 사용 방법은

$ENV{'원하는 환경변수'}; # 이렇게 하시면 됩니다. 
$temp = $ENV{'REMOTE_ADDR'}; # 하시면 접속한 사람의 IP주소를 알수 있죠.

 자주 쓰이는 변수를 정리해 보았습니다. 물론 이외에도 많이 있어요.

  • CONTENT_LENGTH
  • 폼과 함께 제출된 데이터 내용의 바이트 수

  • CONTENT_TYPE
  • 폼과 함께 제출된 데이터 내용의 타입

  • HTTP_USER_AGENT
  • 웹 브라우져 소프트웨의 버젼

  • PATH_INFO
  • 요청과 함께 웹 서버로 보내어진 경로

  • QUERY_STRING
  • 폼 제출로 부터 데이터를 담고 있는 문자열

  • REMOTE_ADDR
  • 클라이언트의 IP주소

  • REMOTE_HOST
  • 클라이언트의 호스트 이름

  • REQUEST_METHOD
  • 스크립트를 호출하는 방법(GET, POST)

프로그램 인자 - @ARGV

펄 명령 라인 내에서 지정된 인자들은 특수 배열인 @ARGV를 통해 펄 스크립트 내로 전달됩니다.

현재 라인 - $_

특수 변수 '$_'는 입력의 현재 라인을 저장합니다.

$(숫자) - $1, $2, $3 .....

특수 변수 $n는 패턴에 의해 매칭된 변수를 저장할 때 사용됩니다. 그러니깐 첫 번째 매칭된 문자열은 $1에, 두 번째 매칭된 문자열은 $2에... n 번째 매칭된 문자열은 $n 에 기록 됩니다.

특수 변수에 대한 얘기가 조금 미흡한듯 합니다. 하지만 앞으로 무수 하게 쓰이기 때문에, 그때 그때 마다 좀더 자세히 설명하겠습니다.

참고로, 긴 이름 형태의 특수 변수와 파일 핸들 값을 이용해서 특수 변수를 이용하는 방법은 Perl 5 에서 부터 지원 합니다.

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