perl script
TRANSCRIPT
1
Perl Script
한오석, 커뮤니티SU, 커뮤니티개발1팀 2008-09-25
2
2부 : Perl script 의 심화 1부 : Perl script 의 기초
목 차
File, Directory Access
Process
Package, Modules
Database, Socket
Introduction
Let’s Start Perl!
Data type
Control Statement
Subroutines
3
Introduction - Meaning
Extracting information from text files, and printing reports based on that information
4
Introduction - Meaning
5
Introduction - History
History
Bell Labs – pipe concept => $_
C - && || ++ --
Perl1 - Larry Wall
Perl2 – Regular Expression
Perl4 – “Camel” book
CPAN
Perl5.10 (café 5.8.5)
http://www.perl.org http://www.perl.com
6
Introduction - Moto
7
Let’s Start Perl !
(@ARGV);
Good afternoon Oseok Good afternoon KyungBo Good afternoon JongHyeop
8
Data Type
데이터타입
스칼라 배열 해시 레퍼런스 IO 함수
9
Data Type – Scalar
1. 숫자 (Numeric Literals)
$num = 10; # integer
$num = 3.14; # floating point
* Perl 내부에서는 모든 숫자를 배정밀도 부동소수점 (double-precision)포맷을 사용한다.
$i = 10/3;
print $i;
$i = 3.0000000;
print $i;
$i = int(10.3);
print $i;
3 3.33333333333333 3
10
Data Type – Scalar
2. 문자 (String Literals)
$my_str = string; # 문자+숫자로맊 이루어진 경우 사용 가능
$my_str = „string‟; # Single-quoted String
$my_str = q/string/; (변수, 특수문자 파싱할 수 없음)
$my_str = “string”; # Double-quoted String
$my_str = qq/string/; ( 변수, 특수문자 파싱됨 )
$hi = Hi;
$my_str = ‟\‟$hi! Comm\‟‟;
print $my_str;
$hi = Hi;
$mt_str = qq/”$hi! Comm”/;
print $mt_str;
„$hi! Comm‟ “Hi! Comm”
11
Data Type – Scalar
2. 문자 (String Literals)
length($my_str); # 문자의 길이를 리턴
substr($my_str, 3, 4); # $str 3번째 문자부터 4개의 문자열을 맊듬
$my_str = “Hello”;
$my_cnt = length($my_str);
print $my_cnt;
$my_str = “Hello”;
$my_substr = substr($my_str, 2, 2);
print $my_substr;
5 ll
12
Data Type – Scalar
3. 정의 되지 않은 값
$nothing = undef; # null 처럼 아무 값도 정의 되지 않음
defined($var); # 변수가 정의 되어 있는지 리턴
$my_var = “value”;
$my_undef = undef;
$my_noinit;
print „$my_var = „, defined($ my_var ), “\n”;
print „$my_undef= „, defined($my_undef ), “\n”;
print „$my_noinit = „, defined($ my_noinit), “\n”;
$my_var = 1 $my_undef = $my_noinit =
13
Data Type – Scalar
4. 메모리 해제
undef $var;
print „$var = „, $var, “\n”;
$var= “value”;
print „$var = „, $var, “\n”;
undef $var;
print „$var = „, $var, “\n”;
Use of uninitialized value in print at ./deftest.pl line 3. $var = $var = value Use of uninitialized value in print at ./deftest.pl line 7. $var =
14
Data Type – Scalar
5. Boolean – false 로 취급되는 것들
- 0
- undef
- Empty String
- Empty Array
- Empty Hash
15
Data Type – Array
1. 배열의 생성 (Creation)
@my_array = (1, 2, com); # comma로 구분
@my_array = (1..2, a..c); # 1,2,a,b,c
@my_array = qw/1 2 com/; # 빈칸으로 구분
2. 배열의 요소 (Elements)
$my_array[0];
@my_array[0..2];
* $my_array[0] 와 @my_array[0]의 차이는 없지맊, 개별요소의 경우에는
스칼라 변수의 형태로 사용을 권장.
16
Data Type – Array
3. 배열의 크기 (Size)
$my_array_cnt = @my_array; # 배열의 총 개수
scalar @my_array; # 배열의 총 개수
@#my_array; # 배열의 마지막 인덱스
4. 요소의 추가 및 추출
push @my_array $var;
pop @my_array; # 배열의 마지막 요소 리턴
shift @my_array; # 배열의 첫 요소 리턴
17
Data Type – Hash
1. 해시의 생성 (Creation)
%my_hash = („key1‟ => „value1‟,
„key2‟ => „value2‟,
„key3‟ => „value3‟);
%my_hash = qw/key1 value1 key2 value2 key3 value3/;
$my_hash{„key1‟} = „value1‟;
$my_hash{„key2‟} = „value2‟;
$my_hash{„key3‟} = „value3‟;
* 짝이 맞지 않게 생성된 경우에는 Odd number of elements 에러 발생
18
Data Type – Hash
2. 해시의 요소(Elements)
$my_hash{„key1‟}; # 단일 요소 value1
%my_hash; # 젂체 요소 key2value2key1value1…
keys %my_hash # 해시 키 요소 key2key3key1
values %my_hash # 해시 값 요소 value2value3value1
3. 해시의 크기 (Size)
$my_hash_cnt = keys %my_hash; # 해시 키의 총 개수
scalar values %my_hash; # 해시 값의 총 개수
* scalar %my_hash 는 해시 젂체 크기를 반환하지 않고 bucket이라 부르는 해시 저장공간의 정보 used/total을 반환한다.
19
Data Type – References
1. Reference
: C언어의 포인터와 비슷하게 작동함
\$r = \$x; 와 같은 형식은 reference를 수정할 수 없다는 오류
(Can't modify single ref constructor) 발생
\$my_scalar
\@my_array
\%my_hash
\&my_subroutine
$x : 10, $$r : 10
$x = 5;
$r = \$x;
$$r = 10;
printf ('$x : %d, $$r : %d', $x, $$r);
20
Symbol Table
Data Type – References
2. Typeglob
$t_glob = “scalar”; @t_glob = (arr1..arr3); %t_glob = qw/k1 v1 k2 v2 k3 v3/; sub t_glob{ print @_, “\n”; }
scalar arr1arr2arr3 k2v2k1v1k3v3
*c_glob = *t_glob; &c_glob($c_glob); &c_glob(@c_glob); &c_glob(%c_glob);
Typeglob Data
$t_glob @t_glob %t_glob &t_glob
$c_glob @c_glob %c_glob &c_glob
Typeglob (t_glob)
Typeglob (c_glob)
*c_glob = *t_glob;
21
Data Type – References
2. Typeglob
c_scalar c_arr1c_arr2c_arr3 c_k2c_v2c_k1c_v1c_k3c_v3
$t_glob = “scalar”; @t_glob = (arr1..arr3); %t_glob = qw/k1 v1 k2 v2 k3 v3/; sub t_glob{ print @_, “\n”; } *c_glob = *t_glob; &c_glob($c_glob); &c_glob(@c_glob); &c_glob(%c_glob); $c_glob = “c_scalar”; @c_glob = (c_arr1..c_arr3); %c_glob = qw/c_k1 c_v1 c_k2 c_v2 c_k3 c_v3); &t_glob($t_glob); &t_glob(@t_glob); &t_glob(%t_glob);
scalar arr1arr2arr3 k2v2k1v1k3v3
22
Data Type – Special Variable
특수 변수의 종류
Default Input Value $_
마지막으로 실행한 system call에서 오류가 발생한경우, 그 내용을 담는 변수
$!
서브루틴에서 매개변수를 받는 배열 @_
해당 프로그램이 가지는 Process ID 변수 $$
23
Data Type – Special Variable
특수 변수의 종류
프로그램 명 $0
파라미터 배열 @ARGV
시스템 환경정보를 담은 해시 (env) %ENV
OS 이름 변수 (linux) $^O
24
Standard IO
1. STDIN – 키보드 입력
chomp; - \n 맊을 제거
chop; - 마지막 문자를 제거
$input = <>;
$input = <STDIN>;
@input = <>;
25
Standard IO
2. STDOUT – 화면 출력
– 파일 핸들러로 사용 가능
3. STDERR – 화면 출력
– 파일 핸들러로 사용 가능
print STDOUT “out string”;
print “out string”;
26
Functions
데이터 취급에 관렦된 함수들
use constant PI =>3.14; 상수 선언
reverse (@my_arr) 배열을 역순으로 리턴
sort (@my_arr) 배열을 정렧
배열을 역순으로 정렧하려면 ?
@my_arr = (4, 5, 3, 1, 6, 8);
@rs_arr = reverse sort @my_arr;
27
Functions
데이터 취급에 관렦된 함수들
grep (/REGEX/, @str) grep
split (/REGEX/, $str) 문자열 나누기
join ($str, @my_arr) 배열 사이에 문자를 추가
다음 문자열을 모두 빈칸으로 나누려면?
$names = “han,david kim_Lee choi Tom”;
@names = join “ “, split /[, _]\s*/, $names;
28
Control Structure
제어문 홈
제어문
연산자 if – else
unless – else while for
foreach
29
Control Structure – Conditional Statement
1. 연산자 (Operaters)
Greater Greater or Equal
Less Than Less or Equal
Equal Not Equal Comparison
> >= < <= == != <=>
gt ge lt le eq ne cmp
숫자에서맊 올바르게 동작 숫자, 문자에서
모두 올바르게 동작
print „a cmp b : ‟, (a cmp b) , "\n";
print „a cmp a : ‟, (a cmp a) , "\n";
print „b cmp a : ‟, (b cmp a) , "\n";
a cmp b : -1 a cmp a : 0 b cmp a : 1
30
Control Structure – Conditional Statement
2. if ~ elsif ~ else
if (EXPRESSION) { IF_TRUE_ STATEMENT; } elsif (EXPRESSION) { ELSE_IF_ STATEMENT; } else { ELSE_STATEMENT; } STATEMENT if (EXPRESSION); EXPRESSION && STATEMENT; EXPRESSION and STATEMENT;
if (EXPRESSION) STATEMENT; * If 문에서는 반드시 중괄호로 블록처리 해줘야 함.
31
Control Structure – Conditional Statement
3. unless ~ else
unless (EXPRESSION) { IF_FALSE_ STATEMENT; } else { ELSE_STATEMENT; } STATEMENT unless (EXPRESSION); EXPRESSION || STATEMENT; EXPRESSION or STATEMENT;
* unless 문에는 unless 와 else 밖에 없으며, elsunless 같은 것은 없음.
32
Control Structure – Loop
4. while
while (EXPRESSION){ STATEMANT; } STATEMENT while (EXPRESSION); do { STATEMENT } while (EXPRESSION);
* do STATEMENT while (EXPRESSION) 은 do 을 제외한 것과 똑같이 동작
33
Control Structure – Loop
4. until
until (EXPRESSION){ STATEMENT; } STATEMENT until (EXPRESSION); do{ STATEMENT; } until (EXPRESSION);
* do STATEMENT until (EXPRESSION) 은 do 을 제외한 것과 똑같이 동작
34
Control Structure – Loop
5. For
6. Foreach
for ( ; ; ){ STATEMENT; }
foreach VARIABLE (LIST) { STATEMENT; }
print $_;
35
Subroutines
서 브 루 틴
36
Subroutines
1. Subroutine
sub NAME{}
sub NAME(PROTOTYPES){}
생성
NAME;
NAME(@paramter);
&NAME(@parameter);
NAME @parameter;
호출
* 모든 매개변수는 array 의 형태( @_ )로 젂달됨
(@ARGV);
37
Subroutines
1. Subroutine
sub NAME(PROTOTYPES){}
sub foo($);
sub foo(@);
sub foo(\@);
프로토타입
return $var;
return @arr;
return ($var, $var, $var);
리턴
38
Subroutines – Scope
2. Scope
Global Variable
젂역적으로 선언되어 프로그램
내 어느곳이든 접근 가능
our $variable
Local Variable
지역적으로 선언되어
선언된 블록안에서맊 접근가능
my $variable
Dynamic Scoped Variable
선언된 블록안에서 젂역적으로 선언
되어 하위 블록 및 함수에서 접근가능
local $variable
our $our_var; sub foo2{ $our_var; $local_var; } sub foo1{ local $local_var; my $my_var; sub foo2 }
39
File & Directory Handling
파일 디렉토리 핸들링
파일 핸들링
디렉토리 핸들링
40
File – Open & Close
1. Open & Close – 파일 핸들을 연계시키기 위해 사용
* open (MY_FILE, “file.txt”) 는 < 와 같게 작동
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); 열었던 파일을 닫음
open (MY_FILE, “<file.txt”) || die “Couldn‟t open file : $!”;
41
File – Read & Write
2. File Read
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
while(<MY_FILE>){
print;
}
foreach (<MY_FILE>){ print;
}
print readline MY_FILE;
42
File – File Information
4. File Information
Option Description
-d FILEHANDLE (directory) FILEHANDLE이 디렉토리인지 리턴
-e FILEHANDLE (exist) FILEHANDLE이 존재하는지 리턴
-s FILEHANDLE (size) FILEHANDLE의 사이즈 리턴
-r FILEHANDLE (readable) FILEHANDLE 이 읽기 가능한지 리턴
-w FILEHANDLE (writable) FILEHANDLE 이 쓰기 가능한지 리턴
-z FILEHANDLE (zero) FILEHANDLE 의 크기가 0인지 리턴
43
File – Open
5. File Management
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의 젃대경로 출력
44
Directory – Handle
1. Drectory Open
2. Drectory Read
opendir (MY_DIR, “/etc”) || die “Couldn‟t open directory : $!”;
while ($file = readdir MY_DIR){ print $file; }
foreach (readdir MY_DIR){ print; }
@files = readdir MY_DIR
@files = glob(“*”); @files = </data/*>;
45
Directory –
2. Drectory Managerment
Form IN LINUX
chdir DIRECTORY; cd DIRECTORY;
rmdir DIRECTORY; rmdir DIRECTORY;
mkdir DIRECTORY MODE; mkdir –m MODE DIRECTORY;
use Cwd; print getcwd();
현재 디렉토리의 젃대경로 출력
46
Directory – Exercise
예제 - ./test 디렉토리 안의 모든 파일의 내용을 출력
47
Directory – Exercise
예제 - ./test 디렉토리 안의 모든 파일의 내용을 출력
48
Process
프로세스
Child Processor 생성 & 호출
49
Process
프로세스 콜
펄 안에서 다른 프로세스를 실행시켜 자식 프로세스를 호출하고 출력 결과를 받음
50
Process - system
1. 프로세스 관리 – system()
$re = system(“perl hello.pl”); print “return : $re”;
print “What is your name? “; $input = <>; print “Hello! $input”;
hello.pl
PROCESS
What is your name? O Seok Hello! O Seok return : 0
* Child Processor 를 생성하여 모든 것을 넘긴 후 Child Processor 가 끝나면 Parent Processor 로 돌아옴
* 해당 명령 결과 코드값 반환
(-1: 명령어 실행 못함, 0 : 프로세스 실행 완료, 이외의 숫자 : 프로세스 실행 중 오류)
오류 체크 : system(“perl hello.pl”) && die $!;
51
Process - exec
2. 프로세스 관리 – exec()
$re = exec(“perl hello.pl”); print “return : $re”;
print “What is your name? “; $input = <>; print “Hello! $input”;
hello.pl
PROCESS
What is your name? O Seok Hello! O Seok
* Child Processor 를 생성하여 모든 것을 넘긴 후 프로그램 종료하여 exec() 이후로는 Parent Processor로 컨트롤이 돌아오지 않음
* 명령이 실행되지 않은 경우에맊 에러 리턴코드 0 반환
오류 체크 : exec(“perl hello.pl”) || die $!;
52
Process – Back quota
3. 프로세스 관리 – ``
$re = `perl hello.pl`; print “return : $re”;
print “What is your name? “; $input = <>; print “Hello! $input”;
hello.pl
PROCESS
O Seok return : what is your name? Hello~ O Seok
What is your name? Hello~ O Seok
* Child Processor 를 생성하여 모든 것을 넘긴 후 Child Processor 가 끝나면 Parent Processor 로 돌아옴
* 해당 명령의 출력 값을 반환
오류 체크 : `perl hello.pl` || die $!;
53
Package & Modules
* 패키지 * 모듈 * CPAN * perldoc
패키지 & 모듈
54
Package
Package
- 여러 모듈을 사용하는 경우, 또는 여러 함수가 있는 경우 이를 분리하는 역할
sub foo{ return "main\n"; } print "curr foo : ", foo; print "main::foo : ", &main::foo; print "This::foo : ", &This::foo; print "That::foo : ", &That::foo; print "--------------------\n"; package This; sub foo{ return "this\n"; } print "curr foo : ", foo; print "main::foo : ", &main::foo; print "This::foo : ", &This::foo; print "That::foo : ", &That::foo; print "--------------------\n"; package That; sub foo{ return "that\n"; } print "curr foo : ", &foo; print "main::foo : ", &main::foo; print "This::foo : ", &This::foo; print "That::foo : ", &That::foo;
curr foo : main main::foo : main This::foo : this That::foo : that -------------------- curr foo : this main::foo : main This::foo : this That::foo : that -------------------- curr foo : that main::foo : main This::foo : this That::foo : that
55
Modules – create
1. 모듈
- 재사용을 위하여 맊든 소프트웨어 유닛
$ 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 .
56
Modules - create
2. 모듈의 생성
out.pm sub println{ foreach(@_){ print “$_\n”; } } 1;
모듈은 반드시 true를 리턴해야 함
57
Modules – use
3. 모듈의 사용
use DIR::out; 1. @INC 에서 out.pm 을 찾음 2. use module; 이 파싱되는 시점에 모든 모듈을 메모리에 저장. 3. package 명이 반드시 필요하진 않으며, default package인 경우 NAME 만으로 사용가능.
58
Modules – use
3. 모듈의 사용
require DIR::out; require „DIR/out.pm‟; 1. @INC 에서 out.pm 을 찾음 2. 실제 out의 정보가 호출되는 시점에서 해당 부분을 동적 로딩 3. 모듈은 반드시 package를 사용해야 하며, package::NAME 의 형식으로 사용할 수 있음
59
Modules – Basic module
4. CPAN (Comprehensive Perl Archive Network)
:$ cpan; cpan> install Module use Lingua::JA::Number; print to_string(1); => ichi print to_string(2); => ni print to_string(3); => san
cpan> install Lingua::JA::Number
http://www.cpan.org
60
Modules – Basic module
5. 맋이 사용하는 모듈 소개
use strict; - 불안젂한 구조를 제한함
use strict ‟vars‟; no strict ‟vars‟; use strict ‟refs‟; no strict ‟refs‟; use strict ‟subs‟; no strict ‟subs‟;
$var = “hello”; my $var = “hello”;
print $$var; print $var;
sub foo{ … } foo($var); &foo($var);
61
Modules – Basic module
5. 맋이 사용하는 모듈 소개
use integer; - double 이 아닌 integer 산술 연산을 수행
use lib ”PATH”; - 현 프로그램에서 임시 라이브러리 경로로 사용
use File::Cwd; - Current Working Directory 에 관련된 함수 제공 use File::Copy; - 파일 복사에 관련된 함수 제공 use File::Compare; - 파일 비교에 관련된 함수 제공
62
Interactive Interpreter – perldoc
Perldoc
perldoc Module : 모듈 명으로 보는 도큐먼트
perldoc -f function : 함수에 대한 도큐먼트
perldoc -i Keyword : 키워드가 포함된 도큐먼트
perldoc -l Module : 해당 모듈의 경로
63
Database & Socket
데이터 베이스 연동
&
소켓 프로그래밍
64
Database – DBI
1. DBI – SELECT 예제
use DBI; # DBI 모듈 사용 $dbh = DBI->connect (“dbi:Oracle:host=host;sid=db_sid;port=1521”, $user, $password); # HOST, USER, PASSWORD를 매개변수로 connection 변수 생성 ## Select ## $sth = $dbh->prepare(“SELECT name, tel from table”); # 쿼리 준비 $sth->excute; # 쿼리 실행 while(($name, $tel) = $sth->fetchrow_array){ # 결과 변수 바인딩 … } $sth->finish; # statement 해제 $dbh->disconnect; # DB연결 해제
65
Database – DBI
2. DBI – INSERT 예제
use DBI; # DBI 모듈 사용 $dbh = DBI->connect (“dbi:Oracle:host=host;sid=db_sid;port=1521”, $user, $password); # HOST, USER, PASSWORD를 매개변수로 connection 변수 생성 ## Insert ## $query = “INSERT INTO table(name, tel) values (?,?)”; # 쿼리 $sth = $dbh->prepare($query); # 쿼리 준비 $sth->bind_param (1, $name); # 쿼리 변수 바인딩 $sth->bind_param (2, $tel); # 쿼리 변수 바인딩 $sth->excute; # 쿼리 실행 $sth->finish; # statement 해제 $sth->commit; # DB 커밋 $dbh->disconnect; # DB연결 해제
* /hanmail/bin/per/lib/db_common.pm
66
Networking – socket
IO::Socket 예제
* /hanmail/bin/per/lib/net_common.pm
use IO::Socket; # Socket모듈 사용 $buf = 25600; $socket = IO::Socket::INET->new( “PeerAddr => “localhost” , PeerPort => 80 , Proto => “tcp” ); # PeerAddr(Host), PeerPort(Port), Proto(Protocol)로 소켓 생성 $req = “GET / HTTP/1.0\n\n”; # Request Header syswrite ($socket, $req); # Request sysread ($socket, $res , $buf); # Response print $res;
67
Interactive Interpreter – option
perl -e Execute 쉘 상에서 perl 실행
perl -e „$x=“hi”; print “$x\n”;‟
perl -d Debbuging 프로그램 디버깅
68
Interactive Interpreter – option
perl -w worning 경고 표시
perl -we „$x=“hi”;‟
perl -c compile 컴파일 실행
perl -Mmodule 모듈을 사용하여 실행
69
감사합니다
감사합니다