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

프로그램 안에 데이터파일 내장하기

전종필

Perl 언어로 만들어진 프로그램은 텍스트(대개는 텍스트)이기 때문에 편집이 자유롭습니다. 따라서, 별도의 데이터 파일 혹은 프로그램시 필요한 설정 파일을 따로 저장하지 않고 프로그램 내부에 저장하고 싶을 수 있습니다.
물론 변수로 모든 내용을 설정해 둘 수도 있지만, 외부 프로그램(혹은 스크립트)에 의한 데이터 변경이라든가, 가독성을 높이기 위해서라든가, 별도로 저장해 둔 파일인 것처럼 작성하고 싶은 경우가 있을 수 있습니다.
Perl에는 데이터를 (혹은 데이터 파일을) 프로그램 파일 내에 저장할 수 있는 별도의 방법이 있습니다. 바로 __DATA____END__ 토큰을 이용하는 것입니다.
perl이 스크립트 파일에서 __DATA____END__를 만나면, 그 뒤는 스크립트라고 보지 않습니다. 그 뒤는 항상 데이터로 간주하고, DATA라는 파일 핸들이 사용되면, __DATA____END__ 토큰뒤의 내용을 마치 외부파일을 open한 것처럼 사용할 수 있게 해 줍니다. 따라서,

#!/usr/bin/perl
print while <DATA>;
__DATA__
a=banana
b=apple
c=pear
d=melon
라는 내용의 스크립트를 실행하면 프로그램은

a=banana
b=apple
c=pear
d=melon
을 출력합니다.
__END____DATA__ 대신 있어도 마찬가지이며, 두 가지 토큰이 모두 있으면, 앞의 토큰을 기준으로 동작합니다.
이 토큰의 좋은 사용예 중 하나는 아마도 기본설정일 것입니다. 어떤 프로그램을 만들 때, 별도의 설정파일이 있다 하더라도, 사용자가 설정값을 주지않더라도, 고유의 설정값을 사용할 수 있도록 하는 것이 좋을 것이고, 이 고유의 설정값을 설정파일과 같은 형식으로 프로그램 내에 저장해 두는 것입니다.

#!/usr/bin/perl
my $conffile = '/mydir/myfile.conf';
# ... 설정파일을 읽어 설정값을 찾는다(%conf). ...
@ARGV = ( $conffile );
my %conf = map { chomp; split(/=/,$_,2) } <>;
my %default = map { chomp; split(/=/,$_,2) } ;
foreach my $key ( keys %default ) {
	unless( defined $conf ) {
		$conf{$key} = $default{$key};
	}
}

undef %default; # 이제는 필요없어졌으므로...

... 뭔가 세상에 도움되는 일을 한다 ...

__DATA__
rootdir=/home/httpd/html
user=nobody
cgidir=/home/httpd/cgi-bin
유용했나요 ? ^_^ 
Comments