=================================================================
  * Subject : [제18장] 프로그래밍 언어 Perl
  * Writer: w0rm9 (research.hackerschool.org)
  * Date: 2004/03/02
=================================================================

/* 진작했어야 하는 걸 귀차니즘때문에 이제야 합니다.
 * 16장, 17장은 알아서 하세요 ;)
 */
0x01. Perl의 소개

■ Hello, Perl
[w0rm9@work PERL]$ cat hello.pl
#!/usr/bin/perl -w    // -w는 추가 경고를 설정하는 Perl 인터프리터에 대한 옵션

print "Hello, World\n";    // C 와 마찬가지로 Perl 문장은 세미콜론(;)으로 끝난다.

[w0rm9@work PERL]$ chmod +x hello.pl
[w0rm9@work PERL]$ ./hello.pl
Hello, World


0x02. Perl의 변수

■ 스칼라
스칼라 변수는 일반적인 스트링과 숫자

■ 배열
배열 변수는 $ 대신 @ 로 표기한다.

[w0rm9@work PERL]$ cat arrary.pl
#!/usr/bin/perl -w

@a = ("\n", " ", "wiseguys", "fighting"); // 배열 선언
print $a[2], $a[1], $a[3], $a[0];  // 0부터 시작함
print $a[0];

@b = @a[0, 2..3];    // 0번째와 2번째에서 3번째까지를 @b에 할당
print $b[1], $b[2], $b[0];

($b[1], $b[2]) = ($b[2], $b[1]);  // Perl에선 이런식으로 두 변수의 값을 교환할 수 있다.
print $b[1], $b[2], $b[0];

[w0rm9@work PERL]$ chmod +x arrary.pl
[w0rm9@work PERL]$ ./arrary.pl
wiseguys fighting

wiseguysfighting
fightingwiseguys

■ 해시
해시 변수는 조합배열이라 할 수 있다. 키를 통해 데이터를 저장하고 구할 수 있다. 기호는 % 를 사용한다.

[w0rm9@work PERL]$ cat hash.pl
#!/usr/bin/perl

%a = ( "1" => "wise", "2" => "guys", "3" => "fighting", "4" => " ", "5" => "\n" );
print $a{1}, $a{2}, $a{4}, $a{3}, $a{5};

[w0rm9@work PERL]$ chmod +x hash.pl
[w0rm9@work PERL]$ ./hash.pl
wiseguys fighting

■ 인용과 대체
[w0rm9@work PERL]$ cat var.pl
#!/usr/bin/perl
$a = "wiseguys";

print '$a fighting\n';    // 변수나 특수문자가 동작하지 않는다.
print "$a fighting\n";

print "4 babo"+1, "\n";    // 다음과 같은 경우 "4 babo" 가 4로 대체된다.
print "babo 4"+1, "\n";
print "123"+"456", "\n";
[w0rm9@work PERL]$ chmod +x var.pl
[w0rm9@work PERL]$ ./var.pl
$a fighting\nwiseguys fighting
5
1
579

■ 특수 변수
[w0rm9@work PERL]$ cat var2.pl
#!/usr/bin/perl

print $0, "\n";     // 파일이름
print $ARGV[0], "\n";    // 첫번째 인수
print $ARGV[1], "\n";    // 두번째 인수
print $ENV{PATH}, "\n";    // %ENV 해시 변수
print $ENV{USER}, "\n";


[w0rm9@work PERL]$ chmod +x var2.pl
[w0rm9@work PERL]$ ./var2.pl wiseguys fighting
./var2.pl
wiseguys
fighting
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/w0rm9/bin
w0rm9


0x03. 연산자와 함수

■ 숫자 연산자
[w0rm9@work PERL]$ cat test1.pl
#!/usr/bin/perl

$a = (4*5)+3;     // c언어와 같다.
print $a, "\n";

$b = 17 % 5;     // 나머지
print $b, "\n";

$c = 22 % -7;     // 22를 7로 나눈, 나머지 1. 1 - 7 = -6
print $c, "\n";

$d = 2 ** 8;     // 2의 8승
print $d, "\n";

$a = 5; $b = 7;
print ++$a + $b, "\n";    // 6 + 7 = 13

[w0rm9@work PERL]$ chmod +x test1.pl
[w0rm9@work PERL]$ ./test1.pl
23
2
-6
256
13

■ 스트링 연산자
[w0rm9@work PERL]$ cat test2.pl
#!/usr/bin/perl

$a = "w0" . "rm" . "9\n";   // 마침표 연산자는 스트링을 결합한다.
print $a;

$b = "1" . "2";
print $b, "\n";

$c = "number " . 1;
print $c, "\n";

$d = "babo".("w0rm9"x4);   // x는 반복
print $d, "\n";

$e = 1 x 3;     // 3이 아니고 1이 3번
print $e, "\n";

[w0rm9@work PERL]$ chmod +x test2.pl
[w0rm9@work PERL]$ ./test2.pl
w0rm9
12
number 1
babow0rm9w0rm9w0rm9w0rm9
111
[w0rm9@work PERL]$ cat ch.pl
#!/usr/bin/perl

$a = "wiseguys fighting\n";

chomp($a);     // 새 줄 제거
print $a, "\n";

chop($a);     // 마지막 문제 제거
print $a, "\n";

$a = "abc"; print ++$a, "\n";
$a = "azz"; print ++$a, "\n";

$passwd = "w0rm9:x:519:519::/home/w0rm9:/bin/bash";
@pass = split ":", $passwd;   // split는 : 를 기준으로 분리
print $pass[2], $pass[3], $pass[5], "\n";
$newpass = join ":", @pass[0..6];  // join은 : 를 중심으로 결합
print $newpass, "\n";

$string = "wiseguys fighting";
print substr($string, 15), "\n";
print substr($string, -3), "\n";
print substr($string, -18, 9), "\n";  // substr은 문자열을 -18(뒤에서 18번째)부터 9개를 출력. 0부터 시작
print substr($string, 4, 4), "\n";
substr($string, 9, 8, "good");   // 9부터 8개를 good으로 대체
print $string, "\n";

[w0rm9@work PERL]$ chmod +x ch.pl
[w0rm9@work PERL]$ ./ch.pl
wiseguys fighting
wiseguys fightin
abd
baa
519519/home/w0rm9
w0rm9:x:519:519::/home/w0rm9:/bin/bash
ng
ing
wiseguys
guys
wiseguys good

length는 스트링의 길이를 지정
reverse는 스트링을 반대 순서로 반환
uc와 lc는 각각 대문자와 소문자로 반환
ucfirst와 lcfirst는 스트링의 첫 문자를 대문자와 소문자로 반환

■ 논리 연산자와 비트 연산자
논리 연산자 &&, ||, !는 C에서와 같은 기능. 대신 "and", "or", "not"로도 사용가능
숫자를 비교할때 <, >, ==, !=
스트링을 비교할 때 lt, gt, eq, ne

■ 배열 연산
[w0rm9@work PERL]$ cat test3.pl
#!/usr/bin/perl

@a = ("0", "1", "2", "3");
print scalar @a;   //
print $#a;    // 배열 요소, 0부터 시작 그래서 3

print shift @a, "\n";   // 앞의 요소를 shift
print pop @a, "\n";   // 뒤의 요소를 pop
print shift @a, "\n";
print pop @a, "\n";

$a = ();
push @a, "2";    // 뒤에 요소 push
unshift @a, "1";   // 앞에 요소 unshift
push @a, "3", "4";
unshift @a, "-1", "0";
print join ",", @a, "\n";
print join ",", reverse @a, "\n";

@b = sort @a;
print join ",", @b, "\n";

@c = (5, 8, 3, 0, 1);
@d = sort {$a <=> $b} @a;
print join ",", @d, "\n";


[w0rm9@work PERL]$ chmod +x test3.pl
[w0rm9@work PERL]$ ./test3.pl
430
3
1
2
-1,0,1,2,3,4,

,4,3,2,1,0,-1-1,0,1,2,3,4,
-1,0,1,2,3,4,

■ 해시 연산
[w0rm9@work PERL]$ cat test4.pl
#!/usr/bin/perl

%wiseguys = ("1" => "mongii", "2" => "z0nk", "3" => "mirr");
%newguys = reverse %wiseguys;   // erverse 연산을 통해서 keys와 values를 바꿀 수 있다.
print $newguys{"z0nk"};
[w0rm9@work PERL]$ chmod +x test4.pl
[w0rm9@work PERL]$ ./test4.pl
2


0x04. 정규 수식

■ 일치
[w0rm9@work PERL]$ cat test5.pl
#!/usr/bin/perl

$a = "wiseguys forever!!";
print "nice wiseguys!!" if $a =~ /for/;  //$a에 for와 일치하는 문자열을 찾는다. 만약 대소문자를 구별하지 않을려면 /for/i 라고 해준다.
 
[w0rm9@work PERL]$ chmod +x test5.pl
[w0rm9@work PERL]$ ./test5.pl
nice wiseguys!!

□ 평가자
/sho?t/  //?는 0번이나 1번 일치한다. "shot", "shoot"
/sho+t/  //+는 최소한 한번 일치한다. "shot", "shoot", "shooot"..
/sho*t/  //*는 0번 이상 일치한다. "sht", "shot", shoot"...

\t  탭
\n  새줄
\s  공백
\w  단어(영문자/숫자, _)
\d  숫자
\S  공백이 아닌것
\W  단어가 아닌것
\D  숫자가 아닌것
.  모든것

■ 대체
[w0rm9@work PERL]$ cat test6.pl
#!/usr/bin/perl

$a = "wisegays forever!!";
print $a if $a =~ s/gays/guys/;   // gays 가 guys로 대체됨
[w0rm9@work PERL]$ chmod +x test6.pl
[w0rm9@work PERL]$ ./test6.pl
wiseguys forever!!


0x05. 제어 구조와 서브루틴

■ 테스트
■ 루프
■ 문장 변경자
■ 서브루틴


0x06. 파일 입력과 출력




_eof_

Posted by 이버리
,