2. 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
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);
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”;
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 $_;
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
}
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 – 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. 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의 젃대경로 출력
45. 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();
현재 디렉토리의 젃대경로 출력
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 – 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 $!;
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 의 형식으로 사용할 수 있음
60. 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. 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. 62
Interactive Interpreter – perldoc
Perldoc
perldoc Module : 모듈 명으로 보는 도큐먼트
perldoc -f function : 함수에 대한 도큐먼트
perldoc -i Keyword : 키워드가 포함된 도큐먼트
perldoc -l Module : 해당 모듈의 경로