Perl의 복잡한 자료구조를 파일에 저장하거나 불러올 수 있음
-
- 1. 예제 코드
-
- 2. 플랫폼 호환
-
- 3. Comments
-
1. 예제 코드
두 개의 배열을 저장하고 불러오는 예
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
를 그냥 쓸 수 있다.
문서에 의하면 네트워크 오더를 사용할 경우 단점은
- 읽고 쓰는 속도가 느리다 (매번 변환해야 함)
- double 형 실수들은 해당 숫자를 텍스트로 변환해서 저장하므로 유효숫자 마지막 자리에 오차가 생긴다.
- infinity 나 Not a Number 의 경우도 정확히 저장-복원되지 않을 수 있다.
저장된 데이타가 어떤 포맷으로 저장된 건지는 다음과 같이 확인할 수 있다.
$info = Storable::file_magic( $filename )
$info
에는 해시 레퍼런스가 저장되고, 파일이 네트워크 오더로 저장된 경우에는 이 해시에 netorder => 1
키/값 쌍이 생긴다. 네트워크 오더가 아닐 경우는 대신 byteorder
, intsize
등의 정보가 해시에 추가된다.
내 경우는 리눅스 쪽에서 일단 파일을 다시 읽고 nstore로 저장하게 한 후, 그 새로 저장된 파일을 윈도우로 가져와서 사용하였다.
3. Comments
컴퓨터분류