2011년 9월 28일 수요일

Perl 제대로 배우기 - 1장 개요


1장, 개요

#!/usr/bin/perl -w
:: 펄 프로그램이라고 알려줌. 여기서 -w는  Warning 경고 메시지를 출력 하고
print (“Hello, World!!\n”);
:: print 출력 함수 그리고 ()를 사용해도 되고 하지 않아도 됨. \n는 개행 문자 입니다. 문장종료는 세미콜론(;) 입니다.

$name=<STDIN>;
:: $name는 스칼라 변수 , <STDIN> 행 입력 받기
chomp($name);
:: 공백문자를 잘라낸다.(뒤쪽)
if($name eq “cosmoslight”)
:: eq는 두 문자열을 비교 한다. (?? 만약 대소문자 관련없이 비교 하려면은 어떻게) , 반대의 경우 ne
while()
:: 반복 루트
@words = (“xxxx”,”11111”,”22222”);
:: 배열
@words = qw(5555 44444 33333);
:: qw 인용 부호와 “,”를 제거 하여도 위와 동일하게 사용한다.
$words[n]
:: 단일 배열 요소 참조시는 @아니라 $를 사용하며 n 은 0 부터 시작 한다.

if-then-else 형식
if(){
} elsif(){
} else {
}

이름 (key) = 값 형태를 저장하는 해시
%words = qw (
huni ddd33
yuni 123456
cosmoslight 34567
mirageg 1342
);

$words{$keyName} 호출 방식


#!/usr/bin/perl -w

%words = qw {
   huni    xxxddd
   yuni    kkksss
   cosmos  rrrxxx
   mirageg xxdddd
};

print "당신의 이름은?";
$name = <STDIN>;
chomp ($name);

if($name eq "cosmoslight"){
   print "당신은 이창훈?\n";
} else {
   print "안녕, $name\n";
   $inpasswd = $words{$name};  # 암호 가져오기
   print "암호 입력 해보지요?";

   #오류 처리를 위해서 넣어다.     
   if( $inpasswd eq ""){
       $inpasswd = "fuck you";
   }

   $guess = <STDIN>;
   chomp ($guess);

   while($guess ne $inpasswd){
       print "잘못 입력 했어요 다시 입력하세요?";
       $guess = <STDIN>;
       chomp ($guess);
   }
}

정규식
$name =~ /^Cosmoslight\b/i;
:: ^Cosmoslight -> 문자열 시작, \b -> 단어 경계 표시 , i -> 대소문자 구분 없음.

$name =~ s/\W.*//;
:: =~ 정규식 , s -> 스위치 , \W : 비단어 문자 (알파벳,숫자,_ 를 제외한), “.*” 행끝가지의 임의의문자를 의미
s/\W.*//; 비단어 문자를 빈문자열로 변환 한다는 의미

$name =~ tr/A-Z/a-z/;
:: 대문자를 소문자로 변환

서브루틴
sub 함수명{
}
my($para1,$para2)=@_;
:: my - 인수를 두 변수에 저장한다. @_  - 인수들을 저장하는 배열
( $words{$somename} || “groucho”) eq $someguess
:: $words{$somename} || “groucho” -> 해시정보 읽고 기본값은 “groucho” 라는 것이며 그리고 || --> or를 의미 한다.

Perl의 세가지 표준 I/O
  • STDIN
  • STDOUT
  • STDERR


<WORSDLIST> : 파일 핸들
open(WORSDLIST,”wordlist”);
:: wordlist 파일을 열고 WORDSLIST 파일 핸들로 지정한다.
while($name=<WORDSLIST>)
:: WORDLIST 결과는 빈문자열 뿐만 아니라 undef 이 될수 있으면 그런 상황을 검사하는 함수는 defined라는 함수 이다.
open (WORDSLIST,"wordslist") || die "can't open wordslist: $!";
:: 파일 열다가 실패 할 경우 die 함수를 통해서 관련 오류 메시지를 출력하고 종료 한다.  $! --> 에러 메시지
-M WORDSLIST >= 7.0
:: 파일 변경 날짜 7 일 이상인지 여부 확인 합니다.
while (defined ($filename = glob(“*.secret”)))
:: glob(“*.secret”) -> 확장자 .secret 인 파일 목록을 가지고 옵니다.

포맷정의
format STDOUT =
@<<<<<<<<<<< @<<<<<< @<<<<<<
$filename, $name , $word
.
:: format STDOUT = --> 시작 , “.” --> 종료
@<<<< … --> 필드의 수 , 길이 , 유형
write;
:: STDOUT을 STDOUT으로 호출으로 합니다.
최초 페이지
format STDOUT_TOP =
Page @<<
$%

Filename Name Word
=============== ===============  ====================
:: $% -> 출력된 페이지 수

rename ($filename , “$filename.old” ) || die …
:: rename 함수 -> 이름 변경

dbmopen (%last_good,”lastdb”,0666)||
::해시를 DBM 이라는 디스크 파일에 대응시킴.(즉 저장한다.)
dbmclose (%last_good)
::해시를 닫는다.

foreach $name (sort keys(%last_good)){ … }
:: keys 함수 : 인수로 해시이름을 받아서 그 해시의 모든 키의 리스트를 정렬하지 않는 순서로 리턴 한다.
sort 함수 : 리스트를 알파벳 순서로 정렬 한다.
foreach 함수 : 값들의 리스트를 받아서 각각 차례로 $name 할당 하고 {} 블록을 한번씩 실행 한다.