Tips in Action‎ > ‎문자열‎ > ‎

파일을 통째로 스칼라 변수로 읽어들이기

전종필

텍스트 파일을 읽어 들일 때, 파일 전체를 하나의 스칼라 변수로 읽어 들일 필요가 있을 수 있습니다. 보통은

open(FH, 'myfile') || die $!;
while(<FH>) {
	$whole .= $_;
}
close FH;
로 하거나, 좀 게으른 경우라면,

open(FH, 'myfile') || die $!;
$whole = join '', <FH>>; # 파일 핸들이 리스트 문맥에서는 배열처럼 사용됨.
close FH;
할 것입니다. 파일 핸들을 할당연산자(=) 뒤에 사용하면, Perl은 파일의 내용을 한 줄씩 읽어 옵니다.
그러나, 사실을 명확히 말하면 ``한 줄씩''읽는 것이 아니라, 특수변수 $/ 에 있는 값을 파일에서 만날때까지 읽은 후 반환하는데, $/에는 기본값으로 "\n"이 들어 있기 때문에, 한 줄씩 읽는 것이라고 생각이 될 뿐입니다. 만일 $/ 변수에 ``:''과 같은 문자를 저장한다면 Perl은 한번에 ``:''문자가 나올 때 까지 읽어서 반환합니다. 이 것을 이용하여 이 변수에 undef 값을 설정하게 되면, Perl은 결국 undef값을 찾을 수 없어서 파일의 끝까지 한꺼번에 읽게 됩니다.

open(FH, 'myfile') || die $!;
$/ = undef;
$whole = <FH>;
close FH;
이 방법은 다이아몬드 연산자 <>에도 똑같이 적용됩니다.

$/ = undef;
$whole = <>;
단, 이 경우 $whole = <>;는 첫 번째 파일에만 적용이 됩니다. @ARGV에 주어진 모든 파일의 내용을 읽어 들이려면,

$/ = undef;
$whole .= $_ while <>; # while(<>) { $whole .= $_; }와 같습니다.
이라고 해야 합니다. 
Comments