IT2010. 3. 12. 18:03
반응형

Perl (Practical Extraction Report Language)


■ Perl 원래의 목적은 여러 종류의 컴퓨터가 참여하는 소프트웨어 개발 프로젝트에서 에러를 찾아 수정하는 것이었다. C언어와 매우 비슷한 구조(C의 모든 연산자와 if, for 등 대부분의 제어구조)를 가지고 있으나 C와 다른 점은 포인터 구조, 정의된 형이 없다.


■ Perl 의 특징

1. 강력하고 사용하기 간편하다.

C언어와 유사하다. 그러나 C언어의 포인터는 지원하지 않는다.

2. 텍스트 처리능력이 뛰어나다.

CGI에서 많이 사용하는 형태가 문자열 처리인데 이 부분에서 상당히 강력하다.

3. 라이브러리가 풍부하다.

다양한 서브루틴을 포함한 제어구조 및 선언 문형과 데이터베이스와의 연동, 그래픽 출력 등 이미 만들어진 기능 및 소스 프로그램을 인터넷상에서 쉽게 구할 수 있다.

4. 운영체제에 관계없이 동작한다.

유닉스와 Windows 95/98/NT 모두 잘 동작한다. 그러나 약간의 차이가 있기에 사용시 약간의 수정이 필요하다.

5. 정수가 아닌 키(key)를 사용하여 인덱스하는 연관배열이 있다.

6. 정수, 부동소수, 문자열간의 자동으로 형 변환이 되고, 자동으로 크기 조정이 가능한 배열이 있다.

7. 다양한 함수를 제공한다.

1) Binary Data 변환 함수,

2) File I/O 함수,

3) 스택, 대기행렬 및 기타 다른 유형의 리스트를 지원하는 리스트 조작 함수,

4) 시스템 서비스 함수,

5) 템플릿 중심의 보고서 작성 추가 기능을 가진 C 언어와 비슷한 포맷된 출력 함수 지원.

8. 탐색, 교체, 기타 텍스트 파싱 운영을 위한 강력한 표현식을 지원한다.

9. 추가 문자열 비교 연산자를 비롯하여 완전한 C 언어의 연산자 세트를 지원한다.


■ Perl 로 프로그래밍하기

1. 사용방법

1) Windows NT/95/98 (Unix 운영체제 환경이 아닌 사람의 경우)

Perl 언어 자체가 유닉스에 기반을 두고 있기에 Windows95/98에서 사용하는 것은 좀 구석기적인 방법을 사용하지만 Perl언어 자체를 배우는 목적에서는 도움이 많이 된다고 생각한다.

(1) 설치

① Windows95/98는 Intel기반에 PC이지만 Window NT 사용자의 경우는 3종류의 CPU을 (Intel, PowerPC, Alpha) 가지고 NT사용자의 경우는 각각 다른 프로그램을 설치해야 한다.

② Perl를 C:\perl에서 실행시킬 수 있다. (Window95/98의 경우는 꼭 이 디렉토리에서만 가능하다.)

③ JDK1.2를 copy한 후에 이곳에서 WinZip을 이용하여 압축을 푼다.

④ perl의 디렉토리로 이동하여 install.bat 프로그램을 실행시킨다.


(2) 사용하기

① Perl의 사용은 DOS 창에서 해야 한다.

② edit나 메모장 등 text editor를 이용하여 파일을 작성한다(text type).

③ perl 실행


예제)

C:\perl > edit q1.pl

다음부터는 dos edit상에 내용입니다.

#!/usr/bin/perl - 이 내용은 MS-Windows에서는 필요 없지만 Unix에서는 필수.

print "Perl 연습하기\n";


C:\perl> perl q1.pl


2) 유닉스/리눅스

① 일반적으로 Perl은 서버에 설치가 되어 있어야 가능하나 개인 디렉토리에 설치하여도 실행 가능하다.

perl이 설치되어 있는 디렉토리 경로는 아래와 같이 찾는다.

cim% whereis perl

perl: /usr/bin/perl /usr/local/bin/perl /usr/local/bin/perl /usr/local /bin/perl5.003

② 이곳에서 작업을 하기 위해서는 vi편집기를 사용하는 것이 가장 좋으나 일반적인 사람이 사용하는 HWP과 많은 차이가 있기에 처음 사용하는 사람은 상당히 불편함을 느낀다. 그러나 vi 편집기만큼 강력한 편집기도 아마 없을 것이다. vi를 사용하기 싫은 사람은 메모장이나 즐겨 사용하는 edit를 사용하여 작성 후에 ftp를 사용하여 파일을 전송하여 사용하는 방법을 사용하여야 한다.

③ 작성된 perl 파일(혹은 ftp로 전송된 파일)을 실행할 수 있는 허가권으로 바꾸어 준다. 단순한 ftp는 허가권을 직접 바꿀 수 없다. telnet로 접속하여 허가권을 바꾼다(chmod a+x fname.pl). MS Windows에서 실행되는 CuteFTP에는 허가권을 바꾸는 기능이 있다.

④ perl 프로그램(스크립트)을 실행한다. 이 때 반드시 파일의 permission(허가권)에 실행 허가권이 있어야 한다.

⑤ Perl을 대화형식으로 실행하려면 아래 3) 대화형 Perl 실행 참조.


예제) cim% vi q2.pl

다음부터는 vi 편집기에 작성하는 내용입니다.

#!/usr/bin/perl

print "Perl 연습하기\n";


cim% chmod 755 q2.pl (모든 사용자에게 permission을 실행과 읽기 허가권을 줌)

cim% ls -l q2.pl

-rwxr-xr-x 1 s9836001 student 55 4월 4일 14:58 q2.pl


cim% q2.pl 혹은 './q2.pl' 이나 'perl q2.pl'이라고 하면 실행이 된다.


3) Perl 프로그램 벌레잡기(Debug)

① perl -d fname.pl - option '-d'를 삽입

② h - help 모든 디버거 명령어 리스트를 보여 줌.

③ n - 다음 명령문이 나올 때까지 실행(subroutine 위 단계 까지).

④ <CR> 혹은 <Enter> 마지막 n이나 s를 반복.

⑤ p expr - print expr의 약어.

⑥ r - subroutine에서 return될 때까지 실행.

⑦ s - subroutine까지의 단계.

⑧ q - quit perl 디버거 끝내기


4) Perl을 대화형(Interactive)으로 실행: 처음 Perl 문법을 공부하기에 좋음

① perl -de 0 - 스크립트를 부르지 않고 debugger를 실행

Loading DB routines from $RCSfile: perldb.pl, v$$Revision:. . . $Date: . . .

Emacs support available.

Enter h for help.

main'(pl0000134:1): 0

DB<1> - prompt

② DB<1> print "Hello Perl Script\n";

Hello Perl Script


DB<2> p "Hello pohoo!"

Hello pohoo!

DB<3>

③ 여러 줄을 입력하고자 할 때에는 줄 끝에 "\"를 쓰고 다음 줄에 계속한다.


■ Perl 의 기본문법


1. Perl 의 변수형

Perl 의 가장 편한 점이 변수선언을 미리 할 필요가 없이 필요시 즉흥적으로 만들어서 사용한다. C언어와는 달리 int, float, string을 구별하지 않는다.

변수 사용시 변수의 이름은 사용하려는 내용을 알 수 있도록 이름을 명확히 하는 것이 프로그램 작성시에 도움이 된다. 변수명에 대한 규칙은 다음과 같다.

① C 언어와 같이 대소문자를 구분한다.

② 변수명 앞에는 $를 붙인다. 예) $sum

③ 배열명 앞에는 @를 붙인다. 예) @sum = (1, 2, 3, 4, 5)

④ 배열의 색인(index)는 0부터 시작하고 $#sum은 배열 @sum의 끝 index(크기, 갯수)를 나타낸다.

⑤ $sum과 @sum은 서로 다른 변수로 인식한다.

⑥ 연관 배열형은 %을 사용한다. 예) %data = ('name', 'park', 'age', '45', 'hight', '175')


예제)

#!/usr/bin/perl

$var1 = 1; # 변수를 정의한다.

$var2 = "10";

print $var1 + $var2; # 출력한다.

결과)

11


설명) # : 기호는 주석을 의미한다.

; : 각 문장의 끝, 문장과 문장의 구분자.


예제)

#!/usr/bin/perl

$var1 = 1

$var2 = "10";

print $var1 . $var2;


결과)

110


설명) "." 기호는 두 문자열을 이어 붙이는 기호이다. 이것으로 Perl 이 정수형, 문자형을 구별하지 않는 것을 알 수 있다.


2. Perl 의 배열

변수를 정의하는 부호가 "$" 이라면 배열을 정의하는 부호는 "@" 이다. 배열의 순서는 0 번부터이다.


예제)

#!/usr/bin/perl

@days = ('월' , '화' , '수' , '목' , '금' , '토' , '일');

@weekend = @days[5, 6];

@weekday = @days[0..4];

print "$days[0]\n";

print "$days[1]\n";

print "$days[2]\n";

print "$#days\n";

print @weekend;

($mon, $wed, $fri) = @days[0, 2, 4];

결과)

6

토일

설명) $#days는 배열의 크기를 알려고 할 때 많이 사용한다. $SIZE = @days 와 같음


@days=('Sun','Mon','Tue','Wed','Thr','Fri','Sat');

print (@days[1..5, 0. 6]);

@digits = 0..9; - @digits = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

@hex_digits = (0..9, a..f); - @hex_digits = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f)

@list = (1, 2, 3)x3; - @list = (1, 2, 3, 1, 2, 3, 1, 2, 3)

print @stuff; 는 다음과 동일하다.

for ($i=$[; $i<=$#stuff; $i++) { print $stuff[$i]; }


3. 연관배열

쉽게 설명하면 쌍으로 사용된다고 생각하면 된다. CGI에서는 자료를 구분할 때 이 방법을 자주 사용한다. 꼭 숙지해야 될 부분이다.

부호는 '%'를 사용한다.


예제)

#!/usr/bin/perl


%data = ("name", "천재", "age", "26", "sex", "남", "job", "학생");

print "$data{'name'}\n";

print "$data{'age'}\n";

print "$data{'sex'}\n";


결과)

천재

26


$data{'job'}='회사원';

print @data{'name', 'job'}; - '천재 회사원' 출력

print keys(%data); - 'name age sex job' 출력


4. 연산자

C언어와 똑같고 다른 언어와 같기에 어려운 점이 없을 것이다.


① 산술연산자 : +, - , * , / , % , ++ , --, ** (n제곱) - 예) $i++; $x = 2**3; $x = 2**0.5;

② 논리연산자 : && (논리 AND) , || (논리 OR) , ! (논리 NOT) - 예) (@stuff>=2) || die "Too big";

③ bit형 연산자 : & (and), | (or), ^ (xor), ~ (not), << (왼쪽 이동), >> (오른쪽 이동) - 예) $y=$x<<2;

④ 할당연산자 : = , +=, -=, *=, /=, %/, |=, &=, ^=, ~=, <<=, >>=, **=, .= (문자열 덧셈), x=

- 예) $count -= 1; $str =~ tr/a-z/A-Z;

⑤ 문자열 비교 연산자 : eq , ne , gt , lt , le , ge, cmp - 예) if($log eq 'jong') {print 'OK';}

⑥ 수치 비교 연산자 : == , != , > , < , <=, >= - 예) if($log == 'jong;) {print 'OK';}

⑦ 범위 연산자 : .. - 예) @days=('Sun','Mon','Tue','Wed','Thr','Fri','Sat'); print (@days[1..5, 0. 6]);

⑧ 복제 연산자 : x - 예) print 'b' . 'an'x2 . 'a';

⑨ 3항 연산자 : ? : - 예) $access=($user eq 'jong' ? 'Full' : 'Limited');


예제 7)

print 0177; - 127을 프린트, 8진수 177을 의미 함.

print 0x7f; - 127을 프린트, 16진수 7F(0111 1111) 의미.

print 6 & 3; - 2를 프린트 (0110 AND 0111 = 0010)

print 6.9 & 3.1; - 2를 프린트 (정수)

print 7/3; - 2.3333을 프린트 (정수가 아님)

print int(7/3); - 2를 프린트 (정수)

print (7.9 % 3.6); - 1을 프린트 7÷3 나머지(7 % 3과 동일)

$x = 5;

print ($x < 4); - 표현식이 거짓이면 0을 출력.

$access = ($user eq 'Park' ? 'Full' : 'Limited'); - $user가 'Park'이면 'Full' 아니면 'Limited'


5. 조건문

if (exp1) {명령문1;}

if (exp1) {명령문1;} else {명령문2;}

if (exp1) {명령문1;} elsif (exp2) {명령문2;} else {명령문3;}


예제 7)

#!/usr/bin/perl

$var1 ="abcd";

$var2 ="bcd";

if($var1 gt $var2) { print ">"; }

elsif($var1 lt $var2) { print "<"; }

else { print "=="; }


결과)

<


6. 반복문

while, for ,foreach, do-until 이 있다.

① while문

예제)

#!/usr/bin/perl

$count = 10;


while( $count > 0 ) {

print "$count ";

$count -= 1;

}


결과)

10 9 8 7 6 5 4 3 2 1


while(!(expr)) {명령문;}과 until(!expr) { 명령문;}, do {명령문; } while(!(expr)); 문은 모두 동일.


② for문

예제)

#!/usr/bin/perl

for ($count=10; $count>0; $count-=1) { print "$count "; }


결과)

10 9 8 7 6 5 4 3 2 1


for ($i=0, $j=10; $<10; $i++, $j--) { print $i, ' ', $j; } - comma 연산자 사용(C 언어)


③ foreach문

예제)

#!/usr/bin/perl

@counts = ( '1', '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '10' );

foreach $count (@counts) { print "$count "; }

print "\nloop out\n";


결과)

1 2 3 4 5 6 7 8 9 10

loop out


7. 서브루틴

프로그램을 합리화시키고 좀 더 발전적으로 나아갈 수 있게 만들어 준다. 좀 더 쉽게 설 명하면 부함수라고 할 수 있다. 작은 프로그램이라고 표현하면 어떤지...

자주 사용하는 서브루틴은 라이브러리형태로 저장하여 사용하는 것이 좋다.


예제)

#!/usr/bin/perl


print "Step 1\n";

&proc1; # proc1라는 서브함수를 호출한다.


print "Step 2\n";

&proc2("arj1" , "arj2"); # proc2라는 서브함수를 호출한다.

 

sub proc1 # proc1의 함수를 작성한다.

{

print "Call proc1 \n";

}


sub proc2

{

my(@args) = @_; #매개변수값을 @args에 저장한다.


print "ARG : $_[0] $_[1]\n";

print "ARG : $args[0] $args[1]\n";

}


8. 파일 입출력

Perl 만큼 파일 입출력이 쉬운 언어도 흔치 않을 것이다. 여기서 말하는 것은 물론 txt 의 관점에서 이야기 하지만 역시 Perl 은 문자열을 다루는 것에 있어서는 상당히 powerful 하다 는 것을 알 수 있다.


open( FILE ,'< sample.txt'); 읽을 때

open( FILE ,' sample.txt');

open( FILE ,'> sample.txt'); 쓸 때

open( FILE ,'>>sample.txt'); 추가할 때

close( FILE ); 파일을 열었다면 닫는것도 꼭 잊지 말도록


예제)

#!/usr/bin/perl

# 화일을 생성후에 글 쓰기

open(IN,'>data');

print IN "data라는 화일을 만들다.\n";

close(IN);

# 화일의 내용을 불러드려 출력하기

open(OUT,'data') || die "data화일을 열수 없습니다.\n";

@CONTENTs=<OUT>;

close(OUT);

print "@CONTENTs\n";

 

9. 파일 시험

① -d 파일의 존재 시험 - 예) if(-d 'prob.pl') {print OK;}

② -e 파일의 읽기 허가 시험 - 예) if(-e 'prob.pl') {print 'File Size is' -s 'prob.pl';}

③ -s 파일의 크기 시험

④ -w 파일명이 디렉토리인지 시험 -예) (-w 'dname') || die "Not a directory name!\n";


10. 문자열 연산

1) . 나열, x 복사, =~ 패턴 매치, !~ 패턴 매치 부정 결과

$var='seokyeong';

print ($var =~ /kye/) ? TRUE : FALSE; - 변수 $var에 패턴 'kye'를 포함하면 TRUE 표시

2) 아래 '유용한 함수' 참조


11. 유용한 함수들

① split(Delimeter, Str[, Limit]) -예) @words = split(' ', 'a test string');

② join(Str, List) -예) $str = join(',', 0..3, 5, 7, 11); $str='0,1,2,3,5,7,11';

③ chop(Str) 마지막 문자 삭제 -예) $character=chop($str);

보통 줄 끝의 new line을 제거에 사용.

④ substr(Str, Offset[, Len]) -예) $str = substr('orange',3); $str='nge';

$str = substr('orange',-2); $str='ge';

$str = substr('orange',2, 2); $str='an';

$str='apple'; substr('apple',-3)='ricot'; $str이 'apricot'로 할당.

⑤ reverse(@List) -예) $list=reverse(1..5); - (5,4,3,2,1)

⑥ length(Str) -예) $len=length('Seokyeong University');

⑦ index(Str, SubStr[, Offset]); -예) $idx=('banana', 'na', 3); - '4' 배정

⑧ rindex(Str, SubStr) -예) $location=rindex('banana', 'na'); - '4'

⑨ sort(@List), sort(Subroutine @List) or sort(BlockStatement @List)

예) @list=sort(1,5,2,3,4);

@list=sort(1,2,10); - (1,10,2) ASCII Sort

@list=sort({$a <=> $b} (2,1,10)); - (1,2,10)

@list=sort({$b <=> $a} (2,1,10)); - (10,2,1)

sub mycomp { $b <==> $a }

@list=sort(mycomp (2,1,10)); - (10,2,1)

반응형
Posted by Dream Come True