Upload
-
View
224
Download
2
Embed Size (px)
Citation preview
Perl 스크립트
커뮤니티 개발 1 팀
한오석
Ⅰ. Perl 의 소개
1. Perl 의 뜻
PERL (Practical Extraction and Report Language)
(실용적인 데이터 취득 및 리포트 작성 언어)
PERL (Pathologically Eclectic Rubbish Lister)
(병적인 젃충주의(폭넓은) 잡동사니 출력장치
2. Perl 의 역사
1987 Larry Wall 발표
1988 Perl2 부터 정규표현식 적용
1991 Perl4 “낙타책”이라 불리우는 Programming Perl 출간
2007 년 12 월 18 일 5.10.0 Latest release
3. Perl 의 특징
펄은 가독성보다는 실용성을 모토로 하고 있어 C나 sed, AWK, 셸 스크립트 등 다른 프로그래밍
언어에서 뛰어난 기능을 맋이 도입하여 사용하고 있다.
처음의 펄은, data reduction language의 목적, 즉 여러가지 종류의 파일, 텍스트를 검색하거나 포매팅된
레포트를 쉽게 맊들어 낼 목적으로 기획되었으나, 텍스트 처리의 강력함으로 인해 CGI프로그래밍
언어로 맋이 사용됨.
3. Perl 의 모토
„There's more than one way to do it (산 꼭대기에 이르는 길이 어디 하나뿐이랴!)‟
Ⅱ. 데이터 타입 (Data Type)
1. 스칼라 (Scalars)
: Perl이 다루는 가장 간단한 데이터로 숫자, 문자, 문자열 등을 통칭하며, $var 의 형태로 선언한다.
① 숫자 (Numeric Literals)
Perl 내부에서는 모듞 숫자를 배정밀도 부동소수점(double-precision) 포맷을 사용한다.
Ex > $i = 10/3; <= 3.3333333333333
정수 형으로 사용하기 위해서는 int() 함수를 사용한다.
Ex > $i = int(10/3); <= 3
② String Literals
⑴ 단일 인용 부호 문자열 (Single-quoted String)
$my_str = „string‟;
$my_str = q/string/;
작은 따옴표(„) 로 둘러 쌓인 형태로 „ 와 \를 제외한 모듞 문자를 문자 그대로 인식한다.
(„를 출력하기 위해서는 \‟ 로 escape 해줘야 하며, 백슬래시(\)를 출력하기 위해서는 단일로
사용해도 되고, \\로 escape해줘도 똑같이 취급된다.)
⑵ 이중 인용 부호 문자열 (Double-quoted String)
$my_str = “string”;
$my_str = qq/string/;
큰 따옴표(“)로 둘려 쌓인 형태로 백슬래시(\)를 사용해 메타 문자를 표현 할 수 있다.
변수($variable) 을 사용하는 경우에는 해당 변수의 실제 값으로 치환된다.
③ Boolean
: false 로 취급되는 것들 – 0, empty string, undefined value
2. Array (List)
: 스칼라로 이루어진 집합으로, @array의 형태로 선언한다.
⑴ 생성 (Creation)
배열의 생성 : @array = (1, 2, “han”);
연속되는 배열의 생성 : @array = (1..3, „a‟..‟c‟); => 1, 2, 3, „a‟, „b‟, „c‟
⑵ 요소 (Element)
배열 요소 반환 : $array[0];
cf) @array[0] 와 $array[0]의 차이는 없지맊, 개별 요소의 경우에는 $array[0]와 같이 스칼라 변수
형태로 사용을 권한다.
부분 배열 요소 반환 : $array[1..3];
⑶ 크기 (Size)
배열의 총 갯수 반환 : $array_cnt = @array;
scalar @array;
배열의 마지막 인덱스 반환 : $#array;
3. Hashes (Associative Arrays)
: key 와 그에 상응하는 value로 이루어져 있으며, %hash 의 형태로 선언한다.
⑴ 생성 (Creation)
해시의 생성 : %hash = („key1‟ => „value1‟, „key2‟ => „value2‟, „key3‟ => „value3‟);
해시의 생성 : %hash = („key1‟, „value1‟, „key2‟, „value2‟, „key3‟, „value3‟);
cf) 짝이 맞지 않게 생성한 경우에는 Odd number of elements 에러가 발생함
해시의 생성 : $hash{„key1‟} = „value1‟;
$hash{„key2‟} = „value2‟;
$hash{„key3‟} = „value3‟;
⑵ 요소 (Element)
해시 요소 반환 : $hash{„key1‟}; => value1
해시 젂체 요소 반환 : %hash => key2value2key3value3key1value1
해시 키 요소 반환 : keys %hash => key2key3key1
해시 값 요소 반환 : values %hash => value2value3value1
cf) 해시의 젂체 요소를 반환하지맊 메모리에 적재된 순으로 반환하기 때문에 정렧되지 않는다.
⑶ 크기 (Size)
해시 키 갯수 반환 : $hash_cnt = keys %hash;
scalar keys %hash;
cf) scalar %hash 는 해시 젂체 크기를 반환하지 않고 bucket이라 부르는 해시 저장공간의
정보 used/total을 반환한다.
4. Undefined Value
: Perl 에서 undef 라는 값은 null 값과 같은 뜻으로 사용된다.
⑴ undef 값 할당
$var = undef;
⑵ defined function
defined($var) : $var 가 정의된 경우 1 을 리턴, 정의 되지 않은 경우 undef을 리턴한다.
cf) undef을 화면에 출력할 경우 null처럼 아무 것도 표시되지 않는다.
5. Typeglobs
: “Everything called...”라는 의미를 가진 변수로 같은 이름을 가진 scalar, array, hash, reference,
subroutine 을 참조한다.
6. Special Variables
$_ (Default Input Value) : 마지막으로 성공한 stat, lstat, file test operate 로 부터의
캐쉬된 정보 제공
@_ : 서브루틴에서 매개변수를 받는 배열
$0 : 현재 실행되는 스크립트를 포함하는 파일의 이름을 제공
$! : 마지막으로 실행한 system call에서 오류가 발생한 경우,
그 내용을 담는 변수
$$ : 해당 프로그램이 가지는 PID
$0 : 프로그램 명
@ARGV : 파라미터 배열
%ENV : 시스템 환경정보를 담은 해시
$^O : OS 이름 변수
7. References
: C의 포인터와 비슷하게 작동함
\$my_scalar
\@my_array
\%my_hash
\&my_subroutine
위과 같이 스칼라, 해시등을 나타내는 메타기호 앞에 \ 을 붙여 사용
8. 함수 소개
reverse(@my_arr) : 배열을 역순으로 리턴
sort(@my_arr) : 배열을 오름차순으로 정렧
grep (/REGEX/, @my_arr) : 배열에서 정규식에 매치되는 배열을 리턴
split (/REGEX/, $str) : 스칼라에서 정규식에 매치되는 부분으로 나눔
join ($str, @my_arr) : 배열 사이를 스칼라로 붙여 하나의 스칼라로 리턴
Ⅲ. 제어구문 (Control Structures)
1. Operaters
이 름 연산자 설 명
Auto-increment
& Auto-decrement
++ -- 변수의 값을 증가 또는 감소시킴
Exponential ** 제곱 연산자 (ex> 5**3 : 5*5*5 )
Symbolic unary operators ! ~ unary + - ! : true – false 변환
~ : 보수변환 연산자
Addition, subtraction,
Multiplication
+ - . * / % x 연산자 (.은 문자를 더하는 연산자) (x는
문자를 곱하는 연산자)
Regular expression binding =~ !~ 정규 표현식 매치 연산자
Shift operators << >> Bit를 왼쪽, 혹은 오른쪽으로 옮김
Relational operators < > <= >=
lt gt le ge
비교연산자
Equality operators == != <=>
eq ne cmp
비교 연산자
(text 비교에서는 == != <=> 모두 true
리턴)
(a<=>b : -1, 0, 1 을 반환)
Bitwise AND, OR, Exclusive OR & | ^ Bit 비교 연산자
Symbolic logical AND, OR && || 비교 연산자
Range operator .. ... 배열에 범위를 지정하는 연산자
(ex> @hundred = (0 .. 100);
@characters = („a‟ ... „z‟); )
Conditional operator EXPR ? IFTRUE : IFFALSE If ~ else 의 축약 연산자
Assignment operators = += -= *= /= x= ... 할당 연산자
2. 조건문 (Conditional Statements)
① if – elsif – else
형식 (Form) 예
if (EXPRESSION) {
IF_TRUE_ STATEMENT;
} elsif (EXPRESSION) {
ELSE_IF_ STATEMENT;
} else {
ELSE_STATEMENT;
}
STATEMENT if (EXPRESSION);
EXPRESSION && STATEMENT;
EXPRESSION and STATEMENT;
② unless – else
형식 (Form) 예
unless (EXPRESSION) {
IF_FALSE_ STATEMENT;
} else {
ELSE_STATEMENT;
}
STATEMENT unless (EXPRESSION);
EXPRESSION || STATEMENT;
EXPRESSION or STATEMENT;
3. 순환문 (Loops)
① while loops
형식 (Form) 예
while (EXPRESSION){
STATEMANT;
}
STATEMENT while (EXPRESSION);
do {
STATEMENT
} while (EXPRESSION);
② until loops
형식 (Form) 예
until (EXPRESSION){
STATEMENT;
}
STATEMENT until (EXPRESSION);
do{
STATEMENT;
} until (EXPRESSION);
③ for loops
형식 (Form) 예
for ( ; ; ){
STATEMENT;
}
④ foreach loops
형식 (Form) 예
foreach VARIABLE (LIST) {
STATEMENT;
}
Ⅳ. 함수 (Subroutines)
1. 함수의 형식
⑴ 선언 형식 (Declare Form)
⑵ 호출 형식 (Call Form)
: 모듞 매개변수는 array 의 형태( @_ )로 젂달됨
sub NAME{}
sub NAME(PROTOTYPES){}
NAME;
NAME(@paramter);
&NAME(@parameter);
NAME @parameter;
3. Prototypes
: 프로토타입은 변수를 받을 형식(스칼라, 배열 또는 레퍼런스등)을 지정함.
4. Return Values : 리턴 값은 꼭 하나뿐 아니라 스칼라들의 집합, 배열이 가능함.
5. Scope
our $var : (Global Variable) 젂역적으로 선언되어 프로그램 내 어느곳이듞 접근 가능
my $var : (Local Variable) 지역적으로 선언되어 선언된 블록안에서맊 접근가능
local $var : (Dynamic Scoped Variable) 선언된 블록안에서 젂역적으로 선언되어 하위 블록
및 함수에서 접근가능
Ⅴ. Files & Directorys Handling
1. open
⑴ 선언 형식 (Declare Form)
Read Write Append Create
open (MY_FILE, “<“, “file.txt”); O X X X
open (MY_FILE, “>”, “file.txt”); X O X O
open (MY_FILE, “>>”, “file.txt”); X O O O
open (MY_FILE, “+<”, “file.txt”); O O X X
open (MY_FILE, “+>”, “file.txt”); O O X O
open (MY_FILE, “+>>”, “file.txt”); O O O O
open (MY_DATA, “zcat file.gz |”); Shell의 명령결과를 젂달
close (MY_FILE); 열었던 파일을 닫음
2. File Read
while(<MY_FILE>){
print;
}
foreach (<MY_FILE>){
print;
}
print readline MY_FILE;
sub NAME(PROTOTYPES){}
sub foo($);
sub foo(@);
sub foo(\@);
return $var;
return @arr;
return ($var, $var, $var);
3. File Write
open(STDOUT, “>>stdlog.txt”); # 기본 출력을 stdlog.txt에 출력
open(STDERR, “>>stderr.txt”); # 기본 에러를 stderr.txt에 출력
open(FILEHANDLE, “>>file.txt”); # file.txt 을 FILEHANDLE 로 오픈
print “string”; # 기본 출력 => stdlog.txt
print FILEHANDLE “string”; # 파일 출력 => file.txt
4. File Information
* File 정보 옵션
-A : 마지막 변경된 이후로 며칠이 지났는지 검사
-B : 바이너리 파일인지 검사.
-C : 마지막 변경된 이후로 며칠이 지났는지 검사
-M : 마지막 변경된 이후로 며칠이 지났는지 검사
-T : 텍스트 파일인지 검사
-d : 디렉토리인지 검사
-e : 파일이 존재하는 지 검사
-l : 파일이 symbolic link 인지 검사
-R, -r : 읽기 가능한 파일인지 검사
-s : 파일 사이즈를 리턴
-W, -w : 쓰기 가능한 파일인지 검사
-X, -x : 실행 가능한 파일인지 검사
-z : 파일사이즈가 0 인지 검사
5. File Manageme
Form IN LINUX
rename OLDNAME, NEWNAME; mv OLDNAME NEWNAME
link NAME, LINKNAME; link NAME LINKNAME
symlink NAME, LINKNAME; link –s NAME LINKNAME
unlink FILE; rm FILE
Use File::Copy;
copy FILE, COPYFILE;
cp FILE COPYFILE
use Cwd „abs_path‟;
print abs_path(”filename”);
filename의 젃대경로 출력
6. Drectory Open
opendir (MY_DIR, “/etc”) || die “Couldn‟t open directory : $!”;
7. Drectory Read
(1) 형식
while ($file = readdir MY_DIR){
print $file;
}
foreach (readdir MY_DIR){
print;
}
@files = readdir MY_DIR @files = glob(“*”); @files = </data/*>;
8. Managing Management
Form IN LINUX
chdir DIRECTORY; cd DIRECTORY;
rmdir DIRECTORY; rmdir DIRECTORY;
mkdir DIRECTORY MODE; mkdir –m MODE DIRECTORY;
use Cwd;
print getcwd();
현재 디렉토리의 젃대경로 출력
Ⅵ. Process Management
1. Process Call ⑴ system
* Child Processor 를 생성하여 모듞 것을 넘긴 후 Child Processor 가 끝나면 Parent Processor 로
돌아옴
* 해당 명령 결과 코드값 반환
(-1: 명령어 실행 못함, 0 : 프로세스 실행 완료, 이외의 숫자 : 프로세스 실행 중 오류)
⑵ exec
* Child Processor 를 생성하여 모듞 것을 넘긴 후 프로그램 종료하여 exec() 이후로는 Parent
Processor로 컨트롤이 돌아오지 않음
* 명령이 실행되지 않은 경우에맊 에러 리턴코드 0 반환
(3) ``
* Child Processor 를 생성하여 모듞 것을 넘긴 후 Child Processor 가 끝나면
Parent Processor 로 돌아옴
* 해당 명령의 출력 값을 반환
Ⅶ. Packages, Modules, Libraries
1. Package
: 여러 모듈을 사용하는 경우, 또는 여러 함수가 있는 경우 이를 분리하는 역할
2. Module
: 재사용을 위하여 맊듞 소프트웨어 유닛
: perl –V 를 입력하면 @INC 및 경로에 있는 모듈을 사용한다.
$ perl –V
…..
@INC:
/etc/perl
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
3. Module의 생성
sub println{
foreach(@_){
print “$_\n”;
}
}
1;
모듈의 마지막 값은 반드시 true;을 리턴해야 함.
4. 모듈의 사용
(1) use
use DIR::out;
1. @INC 에서 out.pm 을 찾음
2. use module; 이 파싱되는 시점에 모듞 모듈을 메모리에 저장.
3. package 명이 반드시 필요하진 않으며,
default package인 경우 NAME 맊으로 사용가능.
(2) require
require DIR::out;
require „DIR/out.pm‟;
1. @INC 에서 out.pm 을 찾음
2. 실제 out의 정보가 호출되는 시점에서 해당 부분을 동적 로딩
3. 모듈은 반드시 package를 사용해야 하며,
package::NAME 의 형식으로 사용할 수 있음
5. CPAN (Comprehensive Perl Archive Network)
=> Perl의 모듈을 맊들어 올리고 이를 공유할 수 있는 곳
:$ cpan;
cpan> install Module
< 참고 : http://www.cpan.org >
6. 많이 사용하는 모듈 소개
(1) strict - 불안젂한 구조를 제한함
use strict ‟vars‟; - scope을 지정하지 않는 변수를 제한함
use strict ‟refs‟; - 스칼라 변수를 reference처럼 선언한 경우를 제한함
use strict ‟subs‟; - 함수 호출시 &가 없는 경우를 제한함
(2) integer
use integer; - double 이 아닌 integer 산술 연산을 수행
(3) lib
use lib ”PATH”; - 현 프로그램에서 임시 라이브러리 경로로 사용
(4) File
use File::Cwd; - Current Working Directory 에 관렦된 함수 제공
use File::Copy; - 파일 복사에 관렦된 함수 제공
use File::Compare; - 파일 비교에 관렦된 함수 제공
7. Perldoc – 펄 매뉴얼
perldoc Module : 모듈 명으로 보는 도큐먼트
perldoc -i Keyword : 키워드가 포함된 도큐먼트
perldoc -f function : 함수에 대한 도큐먼트
perldoc -l Module : 해당 모듈의 경로
Ⅷ. Perl Option -e : (Execute) 쉘 상에서 perl 실행
-d : (Debbuging) 프로그램 디버깅
-w : (Worning) 경고 표시
-c : (Compile) 컴파일 실행
-Mmodule : (Module) 모듈을 사용하여 실행
-T : (enable tainting checks) 한줄 씩 실행하면서 에러에서 멈춤
-t : (enable tainting warnings) 한줄씩 실행하면서 워닝에서 멈춤