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