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;
33.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 "mainn"; }
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 "thisn"; }
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 "thatn"; }
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.0nn”; # 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 “$xn”;‟
perl -d Debbuging 프로그램 디버깅
68
Interactive Interpreter – option
perl -w worning 경고 표시
perl -we „$x=“hi”;‟
perl -c compile 컴파일 실행
perl -Mmodule 모듈을 사용하여 실행
69
감사합니다
감사합니다

Perl Script

  • 1.
    1 Perl Script 한오석, 커뮤니티SU,커뮤니티개발1팀 2008-09-25
  • 2.
    2 2부 : Perlscript 의 심화1부 : Perl script 의 기초 목 차  File, Directory Access  Process  Package, Modules  Database, Socket  Introduction  Let’s Start Perl!  Data type  Control Statement  Subroutines
  • 3.
    3 Introduction - Meaning Extractinginformation from text files, and printing reports based on that information
  • 4.
  • 5.
    5 Introduction - History History BellLabs – 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.
  • 7.
    7 Let’s Start Perl! (@ARGV) ; Good afternoon Oseok Good afternoon KyungBo Good afternoon JongHyeop
  • 8.
    8 Data Type 데이터타입 스칼라 배열해시 레퍼런스 IO 함수
  • 9.
    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; 33.33333333333333 3
  • 10.
    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.
    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.
    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.
    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.
    14 Data Type –Scalar 5. Boolean – false 로 취급되는 것들 - 0 - undef - Empty String - Empty Array - Empty Hash
  • 15.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    22 Data Type –Special Variable 특수 변수의 종류 Default Input Value$_ 마지막으로 실행한 system call에서 오류가 발생한경우, 그 내용을 담는 변수 $! 서브루틴에서 매개변수를 받는 배열@_ 해당 프로그램이 가지는 Process ID 변수$$
  • 23.
    23 Data Type –Special Variable 특수 변수의 종류 프로그램 명$0 파라미터 배열@ARGV 시스템 환경정보를 담은 해시 (env)%ENV OS 이름 변수 (linux)$^O
  • 24.
    24 Standard IO 1. STDIN– 키보드 입력 chomp; - n 맊을 제거 chop; - 마지막 문자를 제거 $input = <>; $input = <STDIN>; @input = <>;
  • 25.
    25 Standard IO 2. STDOUT– 화면 출력 – 파일 핸들러로 사용 가능 3. STDERR – 화면 출력 – 파일 핸들러로 사용 가능 print STDOUT “out string”; print “out string”;
  • 26.
    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.
    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.
    28 Control Structure 제어 문 홈 제어문 연산자 if– else unless – else while for foreach
  • 29.
    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.
    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.
    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.
    32 Control Structure –Loop 4. while while (EXPRESSION){ STATEMANT; } STATEMENT while (EXPRESSION); do { STATEMENT } while (EXPRESSION); * do STATEMENT while (EXPRESSION) 은 do 을 제외한 것과 똑같이 동작
  • 33.
    33 Control Structure –Loop 4. until until (EXPRESSION){ STATEMENT; } STATEMENT until (EXPRESSION); do{ STATEMENT; } until (EXPRESSION); * do STATEMENT until (EXPRESSION) 은 do 을 제외한 것과 똑같이 동작
  • 34.
    34 Control Structure –Loop 5. For 6. Foreach for ( ; ; ){ STATEMENT; } foreach VARIABLE (LIST) { STATEMENT; } print $_;
  • 35.
  • 36.
    36 Subroutines 1. Subroutine sub NAME{} subNAME(PROTOTYPES){} 생성 NAME; NAME(@paramter); &NAME(@parameter); NAME @parameter; 호출 * 모든 매개변수는 array 의 형태( @_ )로 젂달됨 (@ARGV);
  • 37.
    37 Subroutines 1. Subroutine sub NAME(PROTOTYPES){} subfoo($); sub foo(@); sub foo(@); 프로토타입 return $var; return @arr; return ($var, $var, $var); 리턴
  • 38.
    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.
    39 File & DirectoryHandling 파일 디렉토리 핸들링 파일 핸들링 디렉토리 핸들링
  • 40.
    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.
    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.
    42 File – FileInformation 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.
    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.
    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.
    45 Directory – 2. DrectoryManagerment Form IN LINUX chdir DIRECTORY; cd DIRECTORY; rmdir DIRECTORY; rmdir DIRECTORY; mkdir DIRECTORY MODE; mkdir –m MODE DIRECTORY; use Cwd; print getcwd(); 현재 디렉토리의 젃대경로 출력
  • 46.
    46 Directory – Exercise 예제- ./test 디렉토리 안의 모든 파일의 내용을 출력
  • 47.
    47 Directory – Exercise 예제- ./test 디렉토리 안의 모든 파일의 내용을 출력
  • 48.
  • 49.
    49 Process 프로세스 콜 펄 안에서다른 프로세스를 실행시켜 자식 프로세스를 호출하고 출력 결과를 받음
  • 50.
    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.
    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.
    52 Process – Backquota 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.
    53 Package & Modules *패키지 * 모듈 * CPAN * perldoc 패키지 & 모듈
  • 54.
    54 Package Package - 여러 모듈을사용하는 경우, 또는 여러 함수가 있는 경우 이를 분리하는 역할 sub foo{ return "mainn"; } 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 "thisn"; } 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 "thatn"; } 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.
    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.
    56 Modules - create 2.모듈의 생성 out.pm sub println{ foreach(@_){ print “$_n”; } } 1; 모듈은 반드시 true를 리턴해야 함
  • 57.
    57 Modules – use 3.모듈의 사용 use DIR::out; 1. @INC 에서 out.pm 을 찾음 2. use module; 이 파싱되는 시점에 모든 모듈을 메모리에 저장. 3. package 명이 반드시 필요하진 않으며, default package인 경우 NAME 만으로 사용가능.
  • 58.
    58 Modules – use 3.모듈의 사용 require DIR::out; require „DIR/out.pm‟; 1. @INC 에서 out.pm 을 찾음 2. 실제 out의 정보가 호출되는 시점에서 해당 부분을 동적 로딩 3. 모듈은 반드시 package를 사용해야 하며, package::NAME 의 형식으로 사용할 수 있음
  • 59.
    59 Modules – Basicmodule 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.
    60 Modules – Basicmodule 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.
    61 Modules – Basicmodule 5. 맋이 사용하는 모듈 소개 use integer; - double 이 아닌 integer 산술 연산을 수행 use lib ”PATH”; - 현 프로그램에서 임시 라이브러리 경로로 사용 use File::Cwd; - Current Working Directory 에 관련된 함수 제공 use File::Copy; - 파일 복사에 관련된 함수 제공 use File::Compare; - 파일 비교에 관련된 함수 제공
  • 62.
    62 Interactive Interpreter –perldoc Perldoc perldoc Module : 모듈 명으로 보는 도큐먼트 perldoc -f function : 함수에 대한 도큐먼트 perldoc -i Keyword : 키워드가 포함된 도큐먼트 perldoc -l Module : 해당 모듈의 경로
  • 63.
    63 Database & Socket 데이터베이스 연동 & 소켓 프로그래밍
  • 64.
    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.
    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.
    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.0nn”; # Request Header syswrite ($socket, $req); # Request sysread ($socket, $res , $buf); # Response print $res;
  • 67.
    67 Interactive Interpreter –option perl -e Execute 쉘 상에서 perl 실행 perl -e „$x=“hi”; print “$xn”;‟ perl -d Debbuging 프로그램 디버깅
  • 68.
    68 Interactive Interpreter –option perl -w worning 경고 표시 perl -we „$x=“hi”;‟ perl -c compile 컴파일 실행 perl -Mmodule 모듈을 사용하여 실행
  • 69.