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의 특징

  1. 핸들러(파일따위)는 <> 연산자로 감싸고, 라인단위로 출력된다.

  2. "|| die" 문을 통한 AssertiveProgramming. 이는 Python의 예외처리와 많이 다르다. file을 열었는데, 뭔가 문제가 생겼다하면, perl은 해당 구문이 false가 되면서 그냥 넘어가지만, python은 명시적으로 예외를 발생시킨다. 그리고, 문제상황이 출력된다. python이 좀더 explict하다고 이야기할 수 있다.

  3. open으로 열었을때 문자열내에 '|'(파이프)를 이용한 외부프로세스 돌리기.
  4. $,@,% 변수,배열,해쉬의 적절한 이용.
  5. 문자열치환등은 RegularExpression의 자체사용

  6. 경로내의 WildCard사용은 <> 연산자안에서 바로 이용가능. python은 glob모듈을 임포트해서 써야한다.

PerlExample (last edited 2013-07-08 15:31:57 by 61)

web biohackers.net