날짜: 1996-04-12 | 글쓴이: 도아 | 10053 번 | 프린트 | 메일로보내기

제 12강 - 파일핸들


펄은 파일 입출력을 처리하는 아주 안전한 방법을 가지고 있다. 이 연산자는 명령행에서 사용하는 리다이렉션(> < >> |등)과 유사하다. 요약 사용형식

open(FILEHANDLE,FILENAME); 
close(FILEHANDLE);
FILEHANDLE
$, @, %와 같은 접두어를 사용하지 않는다.
문자열이 아니므로 인용하지 않는다.
FILENAME
파일 또는 디렉토리를 표시하는 문자열
Open Mode
모드 설명
"FILE" FILE을 입력 모드로 연다. 또한 "<FILE"도 사용할 수 있다.
"> FILE" FILE을 출력 모드로 연다. 필요한 경우 파일을 생성한다.
">> FILE" FILE을 추가 모드로 연다.
"+> FILE" FILE을 읽기/쓰기 모드로 연다.
"| CMD" CMD로 입력될 파이프를 연다. 출력 파일핸들.
"CMD |" CMD로 출력될 파이프를 연다. 입력 파일핸들.
"-" 표준입력을 연다.
"<-" 표준출력을 연다.
CMD
임의의 bourne shell 명령(자체의 파이프, 리다이렉트 포함).
<>
읽기 연산자. 행단위로 읽으며 사용되는 환경에 따라 다르게 동작한다.

	# 스칼라로 한 행을 읽는다.
	$line = <FILEHANDLE>; 
	# 배열로 전체 파일을 읽는다(주의 - 메모리를 많이 취한다)
	@lines = <FILEHANDLE>; 
파일핸들 열기

open(INFO, $file);		# INFO를 통해 읽기만 가능
open(INFO, "<$file");		# INFO를 통해 읽기만 가능
open(INFO, ">$file");		# INFO에 쓰기만 가능
open(INFO, ">>$file");		# INFO에 쓰기만 가능
open(INFO, ">+$file");		# INFO를 통해 읽고, 쓰기 가능
open(INFO, '-');		# 표준입력 열기
open(INFO, '<-');		# 표준출력 열기
파일핸들 닫기

close(INFO);
파일읽기

open(INFO, $file);		# 입력파일 핸들열기
@line = <INFO>;			# INFO로부터 줄단위로 읽어 @line에 저장
close(INFO);			# 파일핸들 닫기
파일쓰기

open(INFO, ">$file");		# 출력 파일 핸들 열기
print INFO @line;		# INFO에 @line의 내용을 출력
close(INFO);
설명

다음은 UNIX cat 명령과 거의 동일한 펄 프로그램이다.

1: #!/usr/local/bin/perl
2: #
3: # 암호파일을 읽고, 이것을 출력한 후, 다시 닫는다.
4:
5: $file = '/etc/passwd';	# 파일명
6: open(INFO, $file);		# 파일 열기
7: @lines = <INFO>;		# 읽어서 배열로 저장
8: close(INFO);			# 파일 닫기
9: print @lines;		# 배열출력

open 함수는 입력 파일을 연다(예: 읽기). 첫번째 매개변수는 앞으로 펄이 파일을 참조할 때 사용하는 filehandle이다. 두번째 매개변수는 파일명을 표시하는 표현식이다. 파일명이 인용되면 쉘확장없이 문자적으로 취해진다. 따라서 표현식 '~/notes/todolist'는 성공적으로 해석되지 못한다. 강제로 쉘 확장을 하려면 소괄호를 사용한다. 즉, <~/notes/todolist>를 사용하면 된다.

close 함수는 파일에대한 동작을 종료하도록 펄에 지시한다.

파일핸들에대한 논의에서 추가해야 하는 몇몇 유용한 것들이 있다. 먼저 open문은 입력뿐만아니라 출력 파일, 추가용 파일을 지정할 수 있다. 출력 하기위해서는 파일명 앞에 >를 붙이며, 덧붙이기위해서는 >>를 붙인다:

open(INFO, $file);		# 입력으로 열기
open(INFO, ">$file");		# 출력으로 열기
open(INFO, ">>$file");		# 추가로 열기
open(INFO, "<$file");		# 입력으로 열기

두번째로 출력용으로 이미 열은 파일에 어떠한 것을 출력하려면 추가적인 매개변수를 갖는 print 문을 사용한다. 임의의 문자열을 INFO라는 파일핸들에 출력하기위해 다음과 같은 문장을 사용한다.

print INFO "이 행이 파일로 쓰여진다.\n";

세번째로 표준입력(보통 키보드)과 표준출력(보통 화면)을 열기위해 다음과 같은 문장을 사용할 수도 있다.

open(INFO, '-');	# 표준입력 열기
open(INFO, '<-');	# 표준출력 열기

위의 프로그램에서 정보는 파일로부터 읽혀진다. 파일은 INFO 파일이며, 이것으로 부터 읽기위해 펄은 소괄호를 사용한다. 따라서

@lines = <INFO>;

은 파일핸들에의해 지시된 파일을 배열 @lines로 읽어들인다. <INFO>라는 표현식은 한번에 파일 전체를 읽게된다. 이 것은 배열 환경에서 읽기가 취해졌기 때문이다. @lines를 스칼라 $lines로 대치하면 한 행만 읽혀진다. 어떠한 경우이든 각 행은 개행문자로 끝난다. 파일검사 연산자

펄이 쉘에서 빌려온 한가지 특징은 간단한 파일 검사 연산자이다. 일반적으로 검사 연산은 조건식의 일부로서 사용된다. 각각의 연산자는 시험할 파일 또는 디렉토리와 같은 스칼라 값을 취한다. 이들은 연산자이지 함수가 아니므로 괄호는 필요없다는 것을 주의하기 바란다.

연산자 설 명 리턴값
-r 읽기가능 여부 1/0
-x 실행가능 여부 1/0
-e 존재여부 여부 1/0
-d 디렉토리 여부 1/0
-f 일반파일 여부 1/0
-s 파일크기 파일크기
-z 0 바이트 파일 1/0
-T 텍스트파일 여부 1/0
-B 이진파일 여부 1/0
-M 생성일자 0이상의 값

 1: $homedir = (getpwnam(artech))[7]; 
 2: if (-e "$homedir/.cshrc") { 
 3:     # 사용자의 홈 디렉토리에 C Shell 파일이 있는지를 검사
 4:     open(F "$homedir/.cshrc");
 5: 	@line = <F>;
 6: 	close(F);
 7: 	print @line;
 8: }else {
 9: 	print "C Shell 파일이 없습니다.\n";
10: }

getpwnam를 통한 시스템과의 인터페이스를 주의하기 바란다. 패스워드 파일과 같은 것들(NIS나 유사한 것들을 통해서도 가능하다)을 접근할 수있는 기능이 내장되어 있다는 것때문에 펄은 시스템 관리자들에게서 폭넓게 사용된다.

getpwnam가 리턴하는 리스트를 명시적으로 참조한다는 것을 주의하기 바란다. getpwnam는 패스워드 파일내 사용자에대한 모든 정보를 리턴하며, 프로그램에서는 단지 8번째 요소만을 취한다. 표준입력(STDIN)

펄에서 키보드로부터 입력을 받아들이기위해 표준입력(STDIN)을 사용한다. STDIN은 STDOUT, STDERR과 더불어 시스템에서 미리 정의한 파일 핸들이므로 open하지 않고 바로 사용할 수 있다.

 1 : #! /usr/local/bin/perl
 2 : 
 3 : print "이름은 모니? ";
 4 : chop($a = <STDIN>);
 5 : 
 6 : print "\n 이름은 $a이구나\n";
 7 : 
 8 : print "니가 좋아하는 것을 몽조리 입력해봐라.\n";
 9 : @favor = <STDIN>;
10 : 
11 : print "짜식 별걸다 좋아하네?\n";
12 : print "니가 좋아하는 것: \n";
13 : print @favor;
연습 - 방명록

사용자의 입력을 guestbook.html로 저장하도록 guest.cgi를 변경한다. 사용자 입력을 화면으로 출력시키는 부분은 변경할 필요가 없다.

파일로부터 데이터를 읽거나 쓰기 위해서는 다음과 같은 방법을 사용한다. 읽기

open(F, file) || die "$!";
@line = <F>;
close(F);
생성하기

open(F, '>file') || die "$!";
print F @line;
close(F);
추가하기

open(F, '>>file') || die "$!";
print F @line;
close(F);

주의 사용자의 입력을 guestbook.html에 쓰기위해서는 guestbook.html 파일의 사용권한은 반드시 666 이어야 한다. CGI를 기동하기전에 guestbook.html 파일의 사용권한을 확인해 보기 바란다.



다음글: 제 13강 - print 문 (6845)1996-04-13
이전글: 제 11강 - 시스템 변수 (5478)1996-04-11

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.