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

댓글 없음: