2013년 9월 10일 화요일

Perl 제대로 배우기 - 10장 (File Handle and File Test)

10. File Handle and File Test

파일 핸들(file handle) - Perl 프로세스와 외부 세계와의 I/O 연결에 대한 이름이다.
  • STDIN - 표준 입력
  • STDOUT - 표준 출력
  • STDERR - 표준 에러
** 파일핸들을 모두 대문자로 사용할 것을 권고 함.

파일핸들을 열고 닫기
open 함수 : 파일은 연다.
문법  : open(FILEHANDLE,”somename”);
:: FILEHANDLE - 새로운 파일핸들
:: somename - 새로운 파일핸들과 결합될 외부 파일 이름(파일 또는 장치와 같은)
** 기록을 위해서 파일 여는 경우는
open (OUT,”>outfile”);
** 내용 추가를 위해서 파일을 여는 경우
open (LOGFILE,”>>mylogfile”);

close 함수 : 그것은 닫는다.. , 프로그램을 종료하는 자동으로 닫힌다.
문법 : close(LOGFILE);

약간의 전용 : die
** 성공적으로 열리지 않은 파일핸들도 프로그램 전반에 아무런 경고 없이 사용될 수 있다. 이런 경우 만약 파일 핸들로 부터 읽어 들인다면 파일(EOF)을 얻게 된다. 이런경우에 파일을 쓴다면 , 그 데이터는 조용히 사라진다.
unless(open(DATAPLACE,”>/tmp/dataplace”)){
    print “Sorry, I couldn’t create /tmp/dataplace\n”;
}else{
    # 여러분의 프로그램
}

unless(open(DATAPLACE,”>/tmp/dataplace”)){
    die “Sorry, I couldn’t create /tmp/dataplace\n”;
}
# 여러분의 프로그램

open(DATAPLACE,”>/tmp/dataplace”) || die “Sorry, I couldn’t create /tmp/dataplace\n”;
:: 실패일 경우에만 die가 호출 된다.

die 함수는 행번호나 파일명이 자동으로 붙여 진다. 행번호나 파일명이 붙여지길 원하지 않는다면 마지막 “\n”: 뉴라인을 포함시킨다.

** $! 변수 : 가장 최근의 운영체제 에러를 설명하는 에러문자열을 포함.
사용예) open(LOG,”>>logfile”) || die “cannot append: $!”;

파일핸들의 사용

파일 $a를 파일 $b로 복사하기
open(IN,$a) || die “cannot open $a for reading: $!”;
open(OUT,”>$b”) || die “cannot create $b: $!”;
while (<IN>){ # 파일 $a에서 한 행을 $_로 읽음
    print OUT $_;  # 그 행을 파일 $b에 씀
}
close(IN) || die “can’t close $a: $!”;
close(OUT) || die “can’t close $b: $!”;

-x 파일 테스트
파일 테스트와 그들의 의미
파일 테스트
의미
추가
-r
파일 또는 디렉토리 읽기 가능
read
-w
파일 또는 디렉토리 쓰기 가능
write
-x
파일 또는 디렉토리 실행 가능
execute
-o
파일 또는 디렉토리 사용자에 의해 소유됨
owner
-R
파일 또는 디렉토가 실제 사용자에는 읽기 가능하나 유효 사용자에는 그렇지 않음 (setuid 프로그램에 대해서는 -r과 다름)
Read
-W

Write
-O

Owner
-e
파일 또는 디렉토리가 존재
exist
-z
파일이 존재하고 크기가 0이 아님(디렉토리는 절대 공백이 아님)
file size not zero
-s
파일 또는 디렉토가 존재하고 0이 아닌 크기를 가짐(값은 바이트 단위의 크기임)
file size not zero
-f
항목이 일반 파일
file
-d
항목이 디렉토리
directory
-l
항목이 심볼릭 링크
symbolic link
-S
항목이 소켓
Socket
-p
항목이 이름있는 파이프(“fifo”)
named pipe
-b
항목이 (마운트 가능한 디스크 처럼) 블록 파일
block file
-c
항목이 (I/O 장치 처럼) 문자 파일
character
-u
파일 또는 디렉토리가 setuid가 설정됨
uid
-g
파일 또는 디렉토리가 setgid가 설정됨
gid
-k
파일 또는 디렉토리에 스티키(sticky) 비트가 설정됨
sticky
-t
파일 핸들상의 isatty()가 참

-T
파일 “텍스트" 파일임.
ASCII text
-B
파일 “이진” 파일임.
Binary
-M
파일이 마지막으로 수정된 이후의 날 수
Modify days
-A
파일이 마지막으로 액세스된 이후의 날 수
Access days
-C
파일이 마지막으로 수정된 이후의 I-코드가 마지막으로 변경된 이후의 날 수


** 대부분 참과 거짓을 리턴 한다.
참과 거짓을 리턴하지 않는 경우
-s 연산자는 공백이면 0 (거짓), 공백이 아니면 파일의 길이 바이트를 나타낸다.
-M,-A,-C : 변경이후의 날수를 리턴함.

-r,-s 파일이름이나 핸들러 이름을 생략하면 $_ 변수에 있는 파일이 된다.
ex)
foreach(@some_list_of_filenames){
   print “$_ is readable\n” if -r; #-r $_와 동일
}



stat과 lstat 함수
- display file or file system status (get file status)
stat 함수의 리턴값은 undef 이거나 스칼라 변수 리스트로 13개 요소의 목록이다.
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(...);
lstat는 심볼릭 링크에 대한 stat 정보를 확인 할수 있다.
** 만약 파일명이나 파일핸들러를 생략하면 디폴트는 $_ 이다.
stat 변수 목록 설명
변수명
설명
dev
ID of device containing file
ino
inode number
mode
protection
nlink
number of hard links
uid
user ID of owner
gid
group ID of owner
rdev
device ID (if special file)
size
total size, in bytes
atime
time of last access
mtime
time of last modification
ctime
time of last status change
blksize
blocksize for filesystem I/O
blocks
number of blocks allocated

Perl 제대로 배우기 - 9장 (ETC Control Flow)

9. ETC Control Flow
** 루프 블록 :: for, foreach,while,until , 자체 (naked)
last 문
:: 가장 안쪽의 루프 블록을 빠져 나오도록 한다.
while(something){
something;
if(somecondition){
something_other;
last; #while 루프를 벗어남.
}
morething;
}
# last 는 이곳으로 옴
next 문
:: 블록을 마치지 않고 가장 안쪽 루프 블록의 나머지를 건너뛰어 실행한다.
while(something){
firstpart;
if(some_cond){
somepart;
next;
}
otherpart;
#next 는 이곳으로 온다.
}
redo 문
:: 현재 블록의 시작 부분으로 건너 뛰도록 한다.(제어식을 다시 계산하지 않음.)
while(something){
# redo는 이곳으로 온다.
firstpart;
if(some_cond){
somepart;
redo;
}
otherpart;
}
아래와 같이 무한 루프를 만들 수도 있다.(자체:naked) 블록을 응용
{
startstuff;
if( some_cond){
last; #탈출
}
laterstuff;
redo;
}

라벨 붙은 블록
라벨은 모두 대문자와 숫자로 구성되어야 한다.
라벨 뒤에는 (:) 뒤 블록을 포함하는 문장이 와야 한다.

표현식 수정자
some_exp if control_exp;
control_exp 먼저 계산 하고 some_exp 하거나 하지 않는다.

제어구조로서의 && 와 II
추후정리

Perl 제대로 배우기 - 8장 (Function)

8. Function
사용자 함수의 정의
sub subname{
statement_1;
statement_2;
}
서브 루틴의 정의 전역적(global) 하다. 동일한 이름의 서브루틴 정의가 두개 있으면 나중의 것이 이전의 것을 덮어쓴다.

인수
인수는 자동으로 @_ 라는 특수 변수에 할당된다.
sub add{
$sum = 0;
foreach $_ (@_){
$sum += $_;
}
return $sum;
}

함수내의 사설 변수
my 연산자를 사용한다.
sub add{
my($sum); #$sum 지역 변수를 생성함.
}
local을 이용한 준사설(semiprivate) 변수
local 함수를 사용하여 준 변수를 만들수 있다?
local 함수를 사용하게 되면 임시적(지정된 함수)으로만 지역 된수되고 벗어나면 전역변수처럼 동작하게 된다.

파일 레벨 my() 변수
use strict; :: perl 프라그마(pragma) , 반드시 변수를 선언하고 사용해야 하는 제약이 발생한다.
변수 선언을 강제함으로써 생기는 잇점은

  • 좀더 빨리 실행됨.
  • 타이상 오류를 빨리 잡을 수 있다.