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 할당 하고 {} 블록을 한번씩 실행 한다.

2011년 3월 22일 화요일

오늘 산에 가다

거의 한달만에 요즘 유행하는 둘래길에 갔다. (관악산의 지산인 호암산) 근처이다. 
아주 어려서 부터 다녔던 길이라서 둘래길이라고 하니까 뭐 명칭이 아주 좋다.
한글이다. 둘래길 ,
길의 시작은 삼성산주공아파트 옆 산장 아파트에서 시작했다. 우리동네 근처 아파트 단지명은 모두 산과 관련이 있다.
그러니까 산과 아주 가깝다. 앞로 길하나만 건너면 된다.
근처 아파트 단지명 , 삼성산 뜨란채, 산장, 벽산, 관악산 휴먼시아 등이 있다. 더 기억해 보면 더 있겠지만 동네가 공기하나는 좋다. 그리고 경치도 좋다. 그러나 지하철에 무지 멀다. 시내로 가는 교통이 아주 불편하다.
그렇지만 모든 것에는 장단점이 있듯이 아주 좋은 자연스러운 공원이 있고, 그리고 사람이 많지 않아서 아주 좋다.
그냥 한시간에서 두시간 정도 시간을 내면 아주 깊은 산속에 들어와 있는 기분을 만끽 할 수 있다.


그런곳 이런 복잡한 서울에서 찾기란 힘들다. 그래서 이곳에 거의 30년 넘게 생활해도 다른 지방 보다 정이 드는 것 같다.
이야기가 다른 곳으로 샌것 같다.
그러니까 둘래길은 시작은 산장아파트 입구 -> 삼성산 천주교 성지 근처 약수터 -> 약수암 뒷편 바위 -> 고시촌
-> 다시 집으로 다녀왔다. 시간은 대략 1시간 내외 였다.
아직 날씨가 쌀쌀 해지만 그래도 양지 바른 곳에서 따뜻한 햇살을 느낄 수 있었다.
특히 마이클잭슨의 Invincible을 들으면서 여러가지 생각에 잠길 수 있었다. 그러던 도중 재미있는 생각이 들었는데
앞으로 만들고 싶은 어플에 대한 아이디어, 좀더 구체화 시켜 보고 싶다. 재미 있을 것 같다.

시간이 지나고 다시 오고

정말 오랜만에 물건을 사기위해서 용산전자상가에 갔다.
이전에 기억 속에 용산전자상가는 항상 새로움이 가득하고 신기한 물것들이 아주 많은 곳이라는 생각이 들었던 곳이다.

그러나 2011년 내가 느낀 용산의 모습은 조금씩 낡아 가는 자동차를 모습이다.

사람들도 그냥 힘이 없는 듯이 느껴지고 조금은 시대에 뒷안길로 사라진는 것 같다.
점자 전자 쇼핑이 늘어 나면서 언제 부터 인가 직접 용산에 갔던적인 얼마 만인가?

기억이 나지 않는다. 그러나 그곳에 예전에 용산이 아니라는 생각이 들었따. 더이상 돈 몇 천원 싸게 사기 위해서 이상가 저상가를 뒤질 필요가 없다.

인터넷으로(다나와,에누리) 가격 검색 싸이트에 최저가를 확인 하면되니까. 물론 다른 물건도 마찬가지라고 생각한다.

오늘 새로이 연 사무실(역삼동)에 네트워크 환경 구축을 위해서 스위치 허브,랜선(100M), RJ45-코드(?), 보호캡(100개), 멀티 탭(한국어로는 뭐더라) , 랜툴(정말 한국어로는 랜도구) 구매 했다. 사실 어떤것이 좋은 것이 몰라서 용팔이에게 조금 당했지만 그래도 가격이 저렴하니 그냥 넘어간다.

그리고 간만에 랜선 작업을 했는데. 요즘 스위치 허브는 auto MDI/MDI-x 기능이 있는데 그것은 upLink 포트를 와 direct 연결을 상관없이 전송되는 환경에 따라 자동으로 인식 (다만 랜선을 정상으로 만들어야 한다) 기능이다.

이기능이 좋은 것 같지만 저 같은 구라로 배운 기술에 대한 좌절을 심어 주었다. 특히 랜선 제작할때
1~8번 (1번 - 주황힌띠,2-주황,3-녹색힌띠,4-파랑,5-파랑힌띠,6-녹색,7-갈색띠,8-갈색) 특히 1,2,3,6 제대로 연결해야 잘 인식하는 것을 알게되었다. 요즘 100M이상을 많이 사용하고 또한 주황(띠), 녹색(띠)는 꼬인 횟수가 촘촘해서 데이타를 잘 전송한다고 한다. 만약 FM대로 랜선을 만들지 않으면 랜선 길이가 길어 지면 데이타 누실 발생한다.

오늘 제대로 배웠다. 내가 아는 지식을 작음을 잘 알겠되었고 그리고 많이 알수록 전문가나 다른 사람이야기 주의 깊게 들어야 한다는 생각이 들었다. 특히 어설픈 지식이거나 경험일 경우 어긋난 판단을 할 수 있다는 생각이 들었다. 뭐 3시간이상 고생을 했지만 아주 큰 배움을 얻었다. 아무튼 옛날 보다 훨씬 네트워크 구축이 쉬었지만 그래도 하루 종일 시간이 소요 되었다.
나중에 꼭 좋은 랜도구와 재료를 하나 정도 구매 하고 싶다. 무선랜도 좋지만 그래도 미리 미리 준비 해야 겠다.

그럼 자주 글을 쓰자.