책 LearningPerl 1장에 나오는 Perl코드 예제. 이 예제하나로 Perl에 대한 많은 것들을 느껴볼 수 있다.
.secret 파일내의 사용자 암호를 읽어서 해당 암호와 맞는 사용자인지 체크하는 스크립트. (sayhello.pl)
1 init_words();
2 print "what is your name? ";
3 $name = <STDIN>;
4 chomp $name;
5 if($name =~ /^randal\b/i) {
6 print "Hello, Randal! How good of you to be here!\n";
7 } else {
8 print "Hello, $name!\n";
9 print "What is the secret word? ";
10 $guess = <STDIN>;
11 chomp $guess;
12 while(!good_word($name, $guess)) {
13 print "Wrong, try again. What is the secret word? ";
14 $guess = <STDIN>;
15 chomp $guess;
16 }
17 }
18
19 dbmopen(%last_good, "astdb", 0666);
20 $last_good{$name} = time;
21 dbmclose(%last_good);
22
23 sub init_words {
24 while($filename = <*.secret>) {
25 open(WORDSLIST, $filename) || die "can't open $filename: $!";
26 if(-M WORDSLST < 7.0) {
27 while($name = <WORDSLIST>) {
28 chomp $name;
29 $word = <WORDSLIST>;
30 chomp $word;
31 $words{$name} = $word;
32 }
33 } else {
34 rename($filename, "$filename.old") || die "can't rename $filename: $!";
35 }
36 close WORDSLIST;
37 }
38 }
39
40 sub good_word {
41 my($somename, $someguess) = @_;
42 $somename =~ s/\W.*//;
43 $somename =~ tr/A-Z/a-z/;
44 if($somename eq "randal") {
45 return 1;
46 } elsif (($words{$somename} || "groucho") eq $someguess) {
47 return 1;
48 } else {
49 open(MAIL, "|mail yong27@naver.com");
50 print MAIL "bad news: $somename guessed $someguess\n";
51 close MAIL;
52 return 0
53 }
54 }
현재 모든 사용자의 암호를 출력하는 스크립트 (list.pl)
1 while($filename = <*.secret>) {
2 open(WORDSLIST, $filename) || die "can't open $filename: $!";
3 if(-M WORDSLIST < 7.0) {
4 while($name = <WORDSLIST>) {
5 chomp $name;
6 $word = <WORDSLIST>;
7 chomp $word;
8 write;
9 }
10 }
11 close(WORDSLIST);
12 }
13 format STDOUT =
14 @<<<<<<<<<<<<<<< @<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<
15 $filename, $name, $word
16 .
17 format STDOUT_TOP =
18 Page @<<
19 $%
20
21 Filename Name Word
22 ========== ====== =======
23
Python과 비교해서 느껴볼 수 있는 Perl의 특징
핸들러(파일따위)는 <> 연산자로 감싸고, 라인단위로 출력된다.
"|| die" 문을 통한 AssertiveProgramming. 이는 Python의 예외처리와 많이 다르다. file을 열었는데, 뭔가 문제가 생겼다하면, perl은 해당 구문이 false가 되면서 그냥 넘어가지만, python은 명시적으로 예외를 발생시킨다. 그리고, 문제상황이 출력된다. python이 좀더 explict하다고 이야기할 수 있다.
- open으로 열었을때 문자열내에 '|'(파이프)를 이용한 외부프로세스 돌리기.
- $,@,% 변수,배열,해쉬의 적절한 이용.
문자열치환등은 RegularExpression의 자체사용
경로내의 WildCard사용은 <> 연산자안에서 바로 이용가능. python은 glob모듈을 임포트해서 써야한다.