4 번째 수정본
Perl의 복잡한 자료구조를 파일에 저장하거나 불러올 수 있음
두 개의 배열을 저장하고 불러오는 예
use Storable;
my @data1 = qw(one won);
my @data2 = qw(two too to);
push @data2, \@data1;
push @data1, \@data2;
store [\@data1, \@data2], 'some_file';
use Storable;
my $result = retrieve 'some_file';
use Data::Dumper;
$Data::Dumper::Purity = 1;
print Dumper($result);
use Storable;
my ($arr1, $arr2) = @{ retrieve 'some_file' };
use Data::Dumper;
$Data::Dumper::Purity = 1;
print Dumper($arr1, $arr2);
use Storable;
my $result = retrieve 'some_file';
use Data::Dumper;
$Data::Dumper::Purity = 1;
print Dumper(@$result);
컴퓨터분류
2. 플랫폼 호환
얼마 전 리눅스에서 store로 저장한 데이타를 윈도우에서 읽으려 했더니 Byte order is not compatible at...라는 메시지가 뜨면서 죽더라. 문서를 살펴보니 store는 기본적으로 해당 플랫폼에서 C언어가 사용하는 데이타타입의 바이트 순서와 사이즈를 그대로 사용해서 저장하는 듯하다 (속도 때문에). 그래서 호환되지 않는 플랫폼에 가면 바이트 오더나 사이즈가 달라서 읽어들이지 못한다. 대신 네트워크 오더를 사용하여 저장하게 할 수 있는데, store 나 store_fd 등 저장하는 함수 이름 앞에 "n"을 붙여서nstore
와 같이 쓰면 된다. 읽을 때는 저장 포맷을 판별하여 자동으로 읽기 때문에retrieve
를 그냥 쓸 수 있다. 문서에 의하면 네트워크 오더를 사용할 경우 단점은$info
에는 해시 레퍼런스가 저장되고, 파일이 네트워크 오더로 저장된 경우에는 이 해시에netorder => 1
키/값 쌍이 생긴다. 네트워크 오더가 아닐 경우는 대신byteorder
,intsize
등의 정보가 해시에 추가된다. 내 경우는 리눅스 쪽에서 일단 파일을 다시 읽고 nstore로 저장하게 한 후, 그 새로 저장된 파일을 윈도우로 가져와서 사용하였다.