[첫화면으로]Perl/Storable

마지막으로 [b]

Perl의 복잡한 자료구조를 파일에 저장하거나 불러올 수 있음

1. 예제 코드
2. 플랫폼 호환
3. Comments

1. 예제 코드

두 개의 배열을 저장하고 불러오는 예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';
# Data::Dumper를 사용해서 출력
use Data::Dumper;
$Data::Dumper::Purity = 1;
print Dumper($result);


# 처음 저장했을 때처럼 두 개의 배열을 각각 따로따로 얻고 싶다면
use Storable;
# $arr1과 $arr2는 두 배열의 레퍼런스
my ($arr1, $arr2) = @{ retrieve 'some_file' };
use Data::Dumper;
$Data::Dumper::Purity = 1;
print Dumper($arr1, $arr2);

# or equivalently:
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 = Storable::file_magic( $filename )
$info에는 해시 레퍼런스가 저장되고, 파일이 네트워크 오더로 저장된 경우에는 이 해시에 netorder => 1 키/값 쌍이 생긴다. 네트워크 오더가 아닐 경우는 대신 byteorder, intsize 등의 정보가 해시에 추가된다.

내 경우는 리눅스 쪽에서 일단 파일을 다시 읽고 nstore로 저장하게 한 후, 그 새로 저장된 파일을 윈도우로 가져와서 사용하였다.

3. Comments

이름:  
Homepage:
내용:
 



컴퓨터분류
각주:
1. Intermediate Perl, Chapter 6.4

마지막 편집일: 2013-3-22 8:08 pm (변경사항 [d])
1795 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기