=================================================================
* 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_