perl
by 권 진영 (gc757489@gmail.com)
perl 이란
Larry Wall이 만들어서 1987년에 발표한 언어.
철학은 There is more than one way to do it, 어떠한 일에는 여러 가지 방법이 존재한다. 로써 Python과 정 반대의 개념
언어의 자유도와 표현력이 높고 텍스트 처리하는 기능에서 특출나다.
Hello world
Code
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
printf "Hello world \n";
result
Hello world
use strict;
: perl 컴파일러의 동작 방식을 변경
use strict 'vars';
: 변수를 선언하지 않고 사용하려 하면 컴파일 에러
use strict 'refs';
: 심볼릭 레퍼런스를 사용하면 런타임 에러
use strict 'subs';
: 따옴표로 둘러 싸지 않은 식별자를 부적절하게 사용할 경우 컴파일 에러
no stict 'refs';
: 옆과 같은 형태로 끌 수 있다.use warnings;
: 경고를 사용하도록 함
타이핑 실수 등, 프로그램에 문제가 있을 경우 경고
type
perl 에서는 기본적으로 데이터 타입은 scalar 변수 딱한가지 밖에 없다.
초기화를 안할 경우 Undef라 하여 문자에는 공백, 숫자에는 0이 들어간다.
별도의 선언 없이 $a = 10
과 같이 바로 사용이 가능하다.
-
scalar : $를 사용하여 정수, 실수, 문자열 등을 할당 할 수 있다.
-
array : 배열, @를 사용
-
hash : key - value, %를 사용
perl은 대부분의 변수를 자유롭게 할당할 수 있다. 크게 숫자, 문자열 정도로만 구분된다고 생각된다고 봐도 될 것 같다.
scalar
scalar example
# scalar basic
$string = 'string';
$float = 1.23;
$decimal = 100;
$octal = 0127;
$hex = 0x2A;
print $decimal;
print "$decimal";
# string+decimal
$mix = $string . $decimal;
print $mix;
string100
위와 같이 scalar타입의 변수 중 숫자와 문자열을 합치면 숫자를 문자열로 인식합니다.
# multiline string
$string = 'This
is
a
multiline
string';
print $string;
This
is
a
multiline
string
# print using EOF
print <<EOF;
This is a
multiline
string
EOF
This is a
multiline
string
array
array example
# array basic
@human1 = (25, "kjy", 'study');
print $human1[0];
# array size
@human1 = (25, "kjy", 'study');
print @human1;
25 kjy study
print $human1;
3
perl은 변수가 사용되는 상황에 따라 동일한 변수를 다르게 처리할 수 있음
- push @ARRAY, LIST : 배열 인자 삽입
- pop @ARRAY : 배열 인자 제거
- shift @ARRAY : 맨앞의 인자를 제거, 배열을 왼족으로 이동
- unshift @ARRAY, LIST : 맨앞에 추가, 배열을 오른쪽으로 이동 아래는 push, pop, shift, unshift의 예제입니다.
# push, pop, shift, unshift example
@coins = ("Quarter", "Dime", "Nickel");
print "1. \@coins = @coins\n";
push(@coins, "Penny");
print "2. \@coins = @coins\n";
unshift(@coins, "Dollar");
print "3. \@coins = @coins\n";
pop(@coins);
print "4. \@coins = @coins\n";
shift(@coins);
print "5. \@coins = @coins\n";
# result
1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel
# array usage
@days = qw/mon tue wed thu fri sat sun/;
print "@days[1..3] \n";
print "@days[-1]"
위와 같이 ..
을 이용하여 배열의 범위를 지정하거나 -1
과 같이 음수 값을 지정하는 것도 가능
# result
mon tue wed
sun
special variable $[
$[
는 모든 배열의 첫 번째 인덱스의 위치를 나타내는 스칼라
기본적으로 배열의 처음 인덱스는 0인데 $[
를 사용하여 변경할 수 있다.
하지만 현재는 다음과 같은 메시지가 출력되는 것으로 보아 사라진 기능으로 보인다.
Assigning non-zero to $[ is no longer possible]
메시지가 출력된다.
merge array
@array = (1, 3, (4, 5));
@array2 = (@array, @array);
hash
hash example
# hash basic
%data = ('key', 'value', 'kjy', 'nas developer');
%hash{'key'} = 'value';
# arraying key
@keys = keys %data;
# add hash & delete hash
## add
%data = ('key', 'value', 'kjy', 'nas developer');
$data{'perl'} = 'hash';
## delete
delete $data{'perl'};
V-string & Special Literals
V-string은 v로 시작하여 하나이상의 점으로 구분된 리터럴입니다.
$smile = v9786;
$foo = v102.111.111;
$martin = v77.97.114.116.105.110;
smile = ☺
foo = foo
martin = Martin
Wide character in print at main.pl line 7.
특수 리터럴은 __FILE__
, __LINE__
, __PACKAGE__
가 있습니다.
__FILE__
: 현재 파일 이름__LINE__
:__LINE__
을 사용한 line number__PACKAGE__
: 패키지 이름
print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";
print "__FILE__ __LINE__ __PACKAGE__\n"; # they can not be interpolated
File name hello.pl
Line Number 4
Package main
__FILE__ __LINE__ __PACKAGE__
제어문
- if : 해당 제어문의 조건이 참이면 수행한다
if, if-else, if-elsif-else 형태로 사용이 가능하다
# example $a = 11; if( $a < 10 ){ # 거짓이기 때문에 후 다음 비교문으로 이동 printf "under 10"; }elsif( $a < 20 ){ # 참이기 때문에 수행 printf "under 20"; }else{ #결과 printf "out of range"; }
# result under 20
- unless : 해당 제어문의 조건이 거짓이면 수행한다(if구문의 반대)
if문과 마찬가지로 unless, unless-else, unless-elsif-else 형태로 사용이 가능하다.
# example $a = 11; unless( $a > 10 ){ # unless의 경우 거짓일때만 수행하기 떄문에 다음 비교문으로 이동 printf "under 10"; }elsif( $a < 20 ){ # 주의 : els(if), if문이라 그런지 참일 경우에 수행한다. printf "under 20"; }else{ #결과 printf "out of range"; }
# result under 20
- 3항 연산자
exp1 ? exp2 : exp3;
Loops
- while : 조건이 참인 동안만 실행
$a = 1; while( $a < 20 ){ printf "$a \n"; $a = $a + 1; }
- until : while의 반대, 조건이 거짓인 동안만 실행
$a = 40; until( $a < 20 ){ printf "$a \n"; $a = $a - 1; }
- do while / do until : while, until과 유사, 차이가 있다면 먼저 실행 후 조건을 확인 ``` perl $a = 1; do{ printf “$a \n”; $a = $a + 1; }while( $a < 20 );
$a = 1; do{ printf “$a \n”; $a = $a + 1; }until( $a < 20 );
- for : 변수의 초기화, 조건, 증감을 for문 안에 넣어서 사용하는 루프
``` perl
for ($a=1;$a<20;$a++){
printf "$a \n";
}
- foreach : list 값을 변수를 사용하여 루프를 제어 ``` perl @list = (1, 2, 3, 4, 5, 6, 7);
foreach $a (@list){ print “$a \n”; }
### Loop Control
- next : 루프의 나머지 부분을 건너뛰어서 마지막으로 이동(다른언어의 continue)
- redo : 다시 조건을 평가하지 않고 루프를 재시작(다른 언어의 continue)
- next vs redo : next를 사용하면 루프의 조건을 평가한다. redo를 사용하면 루프의 조건을 평가하지 않는다.
``` perl
# next vs redo
for($a=0;$a<11;$a++){
# redo를 사용하면 오는 위치
print "next vs redo";
if($a==10){
next;
redo;
}
print "checking next vs redo";
# next를 사용하면 오는위치
}
- last : 루프를 종료(다른언어의 beak)
- continue : while 및 foreach 루프와 함께 사용가능, 실제 함수가 아닌 흐름제어문. 왜 쓰는 건지 아직 의문 ``` perl while(expr){ # redo를 사용하면 오는 위치 do_something; }continue{ # next를 사용하면 오는 위치 do_something_else; }
- goto : 해당 위치로 이동, goto LABEL, goto EXPR, goto &NAME의 3가지 방식
-- goto LABEL : LABEL로 표시된 명령문으로 이동하여 거기서부터 수행
``` perl
$a = 10;
LOOP:for ($a=1;$a<20;$a++){
printf "$a \n";
}
goto LOOP;
– goto EXPR : goto LABEL의 일반화
$a = 10;
EXPR:for ($a=1;$a<20;$a++){
printf "$a \n";
}
goto EXPR;
– goto &NAME : &NAME의 위치로 이동합니다. &NAME은 서브루틴, 스칼라변수, 블록일 수 있다. 단 외부의 서브루틴, 변수등으로 goto불가
# example
# 이해하면
연산자
산술연산자
+
: 더하기-
: 빼기*
: 곱셈/
: 나눗셈%
: 모듈러스, 나머지반환-
**
: 지수연산 (ex.3**4
의 결과는 81 ) ==
: equal, 같음!=
: not equal, 같지 않음<=>
: 왼쪽 값이 오른쪽 보다 작은지 같은지 큰지 비교, 작으면 -1, 같으면 0, 크면 1을 반환>
: 왼쪽이 오른쪽 보다 큼, 초과<
: 왼쪽이 오른쪽 보다 작음, 미만>=
: 왼쪽이 오른쪽 보다 같거나 큼, 이상-
<=
: 왼쪽이 오른쪽 보다 같거나 작음, 이하 lt
: less than, 왼쪽 문자열이 오른쪽 문자열보다 작은 경우 <gt
: greather than, 왼쪽 문자열이 오른쪽 문자열보다 큰 경우 >le
: less equal <=ge
: greather equal >=eq
: equal ==ne
: not euqal !=-
cmp
: 작은지 같은지 큰지, <=>와 유사 =
: 대입 연산자, 오른쪽 값을 왼쪽에 대입+=
: 왼쪽 피연산자 + 오른쪽 피연산자 값을 왼쪽 피연산자에 대입 ,$a =+ $c
는$a = $a + $c
와 같다-=
: 생략*=
: 생략/=
: 생략%=
: 생략-
**=
: 생략 &
: and 비트 연산|
: or 비트 연산^
: xor~
:<<
: 왼쪽 쉬프트-
>>
: 오른쪽 쉬프트 and
: 피연산자가 모두 참이면 참&&
: and와 동일or
: 피연산자가 하나라도 참이면 참||
: or과 동일-
not
: 참이면 거짓으로, 거짓이면 참으로 q{}
: 작은 따옴표로 묶은 문자열을 반환, (ex.q{abc}
는'abc'
를 반환합니다.)qq{}
: 큰 따옴표로 묶은 문자열을 반환, (ex.q{abc}
는"abc"
를 반환합니다.)-
qx{}
: 인용 부호로 묶은 문자열을 반환, (ex.q{abc}
는\
abc``를 반환합니다.) .
: 이항 연산자,.
은 두 문자열을 연결합니다. ``` perl $a = ‘aaa’; $b = ‘bbb’;
printf $a.$b;
결과 : aaabbb
- `x` : 반복 연산자, 오른쪽 피연산자가 지정한 횟수만큼 반복된 왼쪽 피연산자로 구성된 문자열을 반환
``` perl
printf 'a'x3;
결과 : aaa
..
: 범위 연산자, 왼쪽값에서 오른쪽 값까지 1씩 증가하여 반환(ex.(2..5)
는 순차적으로2, 3, 4, 5
를 반환합니다)++
: 자동 증가 연삼자, 변수의 원래 값부터 1씩 증가합니다--
: 자동 감소 연산자, 변수의 원래 값부터 1씩 감소합니다->
: 객체, 또는 클래스에서 메서드 또는 변수를 역참조 할때 사용
연산자 우선순위
left terms and list operators (leftward)
left ->
nonassoc ++ --
right **
right ! ~ \ and unary + and -
left =~ !~
left * / % x
left + - .
left << >>
nonassoc named unary operators
nonassoc < > <= >= lt gt le ge
nonassoc == != <=> eq ne cmp ~~
left &
left | ^
left &&
left || //
nonassoc .. ...
right ?:
right = += -= *= etc.
left , =>
nonassoc list operators (rightward)
right not
left and
left or xor
문자열 처리
split
$var_string = "rain-drops-obj";
@string = split ('-', $var_string);
print @string[1];
drops
sort
기타
시간
- localtime : 날짜 및 시간을 알 수 있는 함수
sec, # seconds of minutes from 0 to 61 min, # minutes of hour from 0 to 59 hour, # hours of day from 0 to 24 mday, # day of month from 1 to 31 mon, # month of year from 0 to 11 year, # year since 1900 wday, # days since sunday yday, # days since January 1st isdst # hours of daylight savings time
# usage
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
my $date=localtime();
print "$year, $mon, $mday, $hour, $min\n";
print "$date\n";
# result
120, 2, 4, 15, 20
Wed Mar 4 15:20:47 2020
year이 120으로 나온 이유는 1900년도 부터 카운팅해서이다. mon 값은 1~12가 아닌 0~11로 되어 있어서 원하는 값을 보려면 +1 을 해주어야 한다
- gmtime : localtime과 동일하게 작동하지만 반환된 값이 표준 그리니치 표준 시간대로 현지화됨
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(); my $date=gmtime(); print "$year, $mon, $mday, $hour, $min\n"; print "$date\n";
# result 120, 2, 4, 6, 25 Wed Mar 4 06:25:25 2020
- time : 에포크 시간
- strftime : POSIX함수 strftime
subroutine
- basic sub
sub test{ print "subroutine test"; }
- passing list to sub ``` perl sub test{ my @list = @_; print “subroutine test @list \n”; } @b = (1, 2, 3); test(@b);
- passing hash to sub
```perl
sub test{
my %hash = @_;
foreach my $key ( keys %hash ) {
my $value = $hash{$key};
print "$key : $value\n";
}
}
%hash = ('name'=>'kjy');
test(%hash);
- return value from a sub
sub test{ my %hash = @_; foreach my $key ( keys %hash ) { $hash{$key} = $hash{$key}.'test'; print "$key : $hash{$key}\n"; } return %hash; } my %hash = ('name'=>'kjy'); %hash = test(%hash); %hash = test(%hash);
- private variables in a sub : 앞서 부분적으로 사용한 my를 사용하여 어휘 변수(개인변수)를 생성할 수 있습니다.
``` perl
global variable
$string = ‘global variable’; sub test{ my $string_my = ‘private variable’; }
- local : 임시 값을 위한 로컬 변수, my랑 비슷한거같은데 이해가 잘안감 차후 검토
``` perl
- statue : 개인 변수와 비슷하지만 서브루틴을 여러 번 호출할 때 다시 초기화되지 않음 ``` perl #!/usr/bin/perl
use feature ‘state’;
sub PrintCount { state $count = 0; # initial value
print “Value of counter is $count\n”; $count++; }
for (1..5) { PrintCount(); }
### reference
#### 참조
perl의 참조는 스칼라, 배열, 해시 값의 위치를 보유하는 스칼라 데이터. 스칼라 특성으로 어디에서나 참조 가능
백슬래시를 접우어로 붙여서 변수, 서브루틴 값에 참조를 할당할 수 있다.
C언어의 포인터-주소????
``` perl
$scalarref = \$foo;
$arrayref = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
$globref = \*foo;
- 배열과 해시의 참조
배열과 해시는 기본적으로 아래와 같이
()
를 사용하여 생성하지만 배열은 대괄화[]
, 해시는 중괄호{}
를 사용하여 참조를 만들 수 있다. ```perlarray
@array = (1, 3, (4, 5));
hash
%data = (‘key’, ‘value’, ‘kjy’, ‘nas developer’);
```perl
# array reference
@array = [1, 3, [4, 5]];
# hash reference
%data = {'key' => 'value',
'kjy' => 'nas developer'
};
역참조
역참조는 기준점에서 위치로 값을 반환합니다.
$var = 10;
$r = \$var; # $r은 스칼라 $var에 참조를 가진다.
print "Value of $var is : ", $$r, "\n"; # $r의 위치에 저장되있는 값을 $$r로 가지고 온다
@var = (1, 2, 3);
$r = \@var; # $r에서 배열 @var에 참조를 가진다
print "Value of @var is : ", @$r, "\n"; # $r의 위치에 저장되어있는 값을 @$r로 가지고 온다
%var = ('key1' => 10, 'key2' => 20);
$r = \%var; # $r에서 해시 %var에 참조를 가진다
# Print values available at the location stored in $r. # $r의 위체이 저장되어 있는 값을 %$r로 가지고 온다.
print "Value of %var is : ", %$r, "\n";))
- ref : ref를 사용하면 참조의 유형을 알 수 있습니다. 참조인 경우에는 SCALAR, ARRAY, HASH, CODE, GLOB, REF를 반환하고 참조가 아니면 false를 반환한다.
$r = \$var; printf "reference type : ref($r) \n"; # 결과는 reference type : SCALAR
원형참조 & 함수에 대한 참조
- 원형참조
순한참조라고도 함. 간단하게 자기 자신을 참조하는 경우로 메모리 누수가 발생할 수 있음
```
my $var = 100;
$var = $var;
printf $$var;
result : REF(0x7fd96183b500))
- 함수에 대한 참조
함수에 대한 참조는 `&`를 사용하여 참조한다
sub testfunction{ printf “test”; } $funcref = \&testfunction;
&$funcref();
### format
포맷은 일종의 글쓰기 템플릿입니다.
- 형식 정의
``` perl
format FormatName = # FormatName : 포맷의 이름
fieldline # fieldline : 특정의 방법으로 데이터를 포맷, 텍스트 또는 필드홀더가 들어갈 수 있다.
value1, 2, 3
fieldline
value1, 2
.
- 필드 홀더 :
@<<<<
좌측과 같은 형식으로 사용가능합니다. 공백 수 를 알리기 위해 @기호와 <기호를 세야한다.# another example @>>>> : right-justified @|||| : centered @####.## : numeric field holder @* : multiline field holder
# example format human = ===================== @<<<<<<< @<< $name $age
위의 예시에서는 name은 7개 공백까지 왼쪽정렬되고 그 이후 부터는 2개의 공백을 둔다.
- 사용 방법 : 생성한 포맷을 사용하려면
write
를 사용해야한다. 하지만write
를 사용하는건 단순히 파일 핸들이라 STDOUT으로 보내려면 STDOUT파일 핸들과 연결해야합니다. 때문에select
함수를 사용하여 STDOUT이 선택된 파일 핸들인지 확인하고 연결합니다. –select(STDOUT);
을 사용하여 STDOUT 선택 –$~ = "human"
; 을 사용하여 포맷과 STDOUT을 연결 –write human;
을 사용하여 형식을 호출 ``` perl format HUMAN = =================================== @«««< @« $name, $age @#####.## $sex =================================== .
select(STDOUT); $~ = HUMAN;
@n = (“kjy”, “kjh”, “kth”); @a = (29, 30, 31); @s = (‘male’, ‘male’, ‘male’);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i]; $sex = $s[$i++]; write; }
### FILE I/O
#### open
```perl
open (FH, "<filename.txt"); or die "couldn't open file";
while(<FH>){
print "$_";
}
FH는 파일핸들입니다. <
기호는 파일을 읽기전용으로 여는 부분이다
or die를 사용하여 파일 오픈을 실패하면 메시지를 출력할 수 있다.
반복문을 이용하여 파일핸들에서 데이터를 받아올 수 있다.
<
: read only, <
, r
>
: create, write, truncate >
, w
+<
: read write, +<
, r+
+>
: read write, create, truncate, +>
, w+
>>
: write, append, create >>
, a
+>>
: read write, append, create +>>
, a+
sysopen
sysopen(FH, "filename.txt", O_RDWR)
sysopen은 함수를 시스템에서 사용하는 것을 제외하고 open과 거의 유사하다.
O_RDWR
: read write
O_RDONLY
: read only
O_WRONLY
: write only
O_CREAT
: file create
O_APPEND
: file append
O_TRUNC
: file truncate
O_EXCL
: 파일이 존재하면 중지
O_NONBLOCK
: non-blocking usability
close
close FH || die "couldn't close";
FileHandle operator
getc
:read
:
File Information
-A
: 스트립트 시작 시간에서 마지막 접근 시간을 뺀 시간-B
: 바이너리 파일인지-C
: 스크립트 시작 시간에서 마지막 inode를 변경한 시간-M
: 스크립트 시작 시간에서 파일 수정 시간을 뺀 시간-O
: 실제 user가 소유하고 있는지-R
: 실제 user또는 group으로 읽기 가능한 파일인지-S
: 소켓 파일인지-T
: 텍스트 파일인지-W
: 실제 user또는 group으로 쓰기 가능한 파일인지-X
: 실제 user또는 group으로 실행 가능한 파일인지-b
: 특별한 블록 파일인지-c
: 특별한 캐릭터 파일인지-d
: 디렉토리인지-e
: 파일 존재여부-f
: plain 파일인지-g
: setgid 비트가 설정되어 있는지-k
: 파일에 고정비트가 설정되어 있는지?-l
: 파일 심볼릭 링크가 있는지-o
: 유효한 user에게 소유 되어 있는지-p
: 파일이름을 지정하는 파이프 ????-r
: 유효한 user와 group에서 읽기 가능한지-s
: 파일의 사이즈를 리턴, 리턴값이 0일 경우 빈파일-t
: 파일핸들이 TTY(terminal)에 의해 열렸는지-u
: setuid 비트가 설정되어 있는지-w
: 유효한 user와 group에서 쓰기 가능한지-x
: 유효한 user와 group에서 실행 가능한지-z
: 파일 사이즈가 0인지 확인
directory
디렉터리 핸들
opendir
: 디렉터리 오픈readdir
: 디렉터리 읽기rewindir
: 포인터 위치잡기?를 시작telldir
: 현재 디렉터리 위치를 리턴seekdir
: dir 내부의 POS를 가리키는 포인터closedir
: 디렉터리 닫기
# basic example
opendir (DIR, '.') or dir "couldn't open dir";
while ($files = readdir DIR){
print "$files";
}
close DIR;
위의 코드는 디렉터리 핸들을 가장 기본적으로 사용하는 방법이다.
opendir
을 통하여 현재 위치의 디렉터리에 대하여 디렉터리 핸들을 생성한다.
readdir
을 사용하여 디렉터리 내용을 읽고 출력한다.
closedir
을 사용하여 디렉터리 핸들을 종료한다.
mkdir
&rmdir
&chdir
: 옆의 명령어는 리눅스를 하는 사람이라면 많이 봤을텐데 perl에서는 같은 기능으로 사용할 수 있다. ```perl $dir = “/root/tmp”;
mkdir ($dir) or dir “couldn’t create dir”; # make dir rmdir ($dir) or dir “couldn’t remove dir”; # remove dir
$dir = “/root/”; chdir ($dir) or dir “couldn’t change dir”; # cd dir
#### glob
`glob`은 모든 파일을 가져오는 간단한 방법이다.
``` perl
$dir = "/root/*.c";
@files = glob($dir);
foreach (@files){
print $_."\n";
}
위는 glob
함수를 사용해서 디렉터리에서 c파일 목록을 가져와서 출력하는 코드이다.
오류처리
$!
: 실제 오류 메시지를 반환
warn
: 경고를 발생시키고 STDERR에 대해서 메시지를 출력한다.
die
: warn
이랑 같지만 exit
를 호출하여 즉시 실행을 종료 한다.
open(DATA, $file) || die "Error: Couldn't open the file $!";)
# 파일을 열고 실패할 경우 `$!`를 통해 에러메시지를 출력하고 `die`를 통해 중단한다.
carp
: warn
과 기본적으로 동일. 스크립트를 종료한 후 스크립트 이름을 STDERR에 추가하여 메시지를 출력한다.
cluck
: carp
와 유사하지만 원래 스크립트에 대한 정보를 포함하여 함수가 호출된 모든 모듈의 스택 추적을 인쇄한다. !!good!!
croak
: die
함수와 유사하지만 호출자에게 하나의 레벨을 더 보고한다. ???????????
confess
: cluck
처럼 die
를 호출한 후 스택 추적을 인쇄한다. ???
위의 기능들은 모두 use Carp;
가 필요합니다.
special variables
$_
: 기본 입력 및 패턴 검색 문자열을 포함합니다.
@_
: 매개변수 전달받기 ??????????????????????????
너무 많으니 https://www.tutorialspoint.com/perl/perl_special_variables.htm 페이지를 참고하자
moose, mouse
module
CPAN 펄로 제작한 소프트웨어를 모아놓은 자료실
.pm
으로 확장명을 생성한 파일로 패키지 이름과 이름이 같은 라이브러리 파일에 정의된 재사용 가능 패키지
예를 들어 create_module.pm
파일은 아래와 같이 생성되야 한다.
package create_module;
sub test{
print "test module";
}
1;
이렇게 패키지 이름과 파일 이름을 동일하게 하여 펄 모듈을 생성가능하다. 생성한 펄 모듈은 아래와 같이 사용한다.
require create_module;
create_module::test();
require
외에도 use
를 사용하여 로드할 수 있다.
use create_module;
test();
프로세스 관리
$$
: 특수변수 $$
또는 $PROCESS_ID
를 사용하여 현재 프로세스ID를 얻을 수 있다
%ENV
: 위의 방법을 사용하여 생성된 모든 프로세스는 %ENV
를 사용하여 자체 가상 환경을 유지, 관리합니다.
close()
: 자식 프로세스가 모두 종료되지 않으면 프로세스는 종료되지 않는데 이 함수를 사용하여 전체 자식 프로세스를 종료함
system()
: system 함수를 사용하여 리눅스 명령을 실행할 수 있다.
fork()
: 리눅스 시스템의 fork와 같은 역할을 하는 함수를 제공, 자식프로세스를 만드는 함수
Database Access
####기본적인 사용방법
- 참고 : https://metacpan.org/pod/DBI
변수 사전 설명
$dsn Database source name
$dbh Database handle object
$sth Statement handle object
$h Any of the handle types above ($dbh, $sth, or $drh)
$rc General Return Code (boolean: true=ok, false=error)
$rv General Return Value (typically an integer)
@ary List of values returned from the database.
$rows Number of rows processed (if available, else -1)
$fh A filehandle
undef NULL values are represented by undefined values in Perl
\%attr Reference to a hash of attribute values passed to methods
데이터베이스 연결
use DBI;
use strict;
my $driver = "mysql";
my $database = "TESTDB";
my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser";
my $password = "test123";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
- DBI->connect 를 함수하여 DB에 접속한다.
데이터베이스 삽입
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
- prepare : 데이터베이스 엔진에서 나중에 실행할 수 있도록 명령문 핸들을 준비
- excute : 준비된 명령문을 수행
-
finish : 해당 명령문핸들이 더 이상 사용되지 않음을 나타냄
- 삽입, 삭제, 읽기, 업데이트 등 : 삽입과 마찬가지로 prepare, excute, finish, commit 단계를 거쳐 작업을 완료한다. 다만 읽기의 경우에는 commit 부분이 필요없다.
CGI
- CGI ? : Comman Gateway Interface 웹서버와 사용자 정으 ㅣ스크립트 간의 정보를 교환하는 방법을 정의 하는 표준
mojo
example function
BEGIN END
: BEGIN 과 END로 코드 블록을 정의할 수 있는데 이는 생성자, 소멸자 역할을 수행한다.# begin end example print "본문"; BEGIN{ print "생성자"; } END{ print "소멸자"; }
# result 생성자 본문 소멸자
mail temp
안됬었음
$to = 'gc757489@gmail.com';
$from = 'kjy8901@gluesys.com';
$subject = 'Test Email';
$message = 'This is test email sent by Perl Script';
open(MAIL, "|/usr/sbin/sendmail -t");
# Email Header
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n\n";
# Email Bo
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
참고 https://www.tutorialspoint.com/perl/perl_scalars.htm https://metacpan.org/pod/DBI