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;
  • 배열과 해시의 참조 배열과 해시는 기본적으로 아래와 같이 ()를 사용하여 생성하지만 배열은 대괄화[], 해시는 중괄호{}를 사용하여 참조를 만들 수 있다. ```perl

    array

    @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";

Alt text


참고 https://www.tutorialspoint.com/perl/perl_scalars.htm https://metacpan.org/pod/DBI