Perl/Storable 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: Perl/Storable 는 읽기 전용 페이지입니다.
[[Perl]]의 복잡한 자료구조를 파일에 저장하거나 불러올 수 있음
== # 예제 코드 == 두 개의 배열을 저장하고 불러오는 예
{{{#!vim 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'; # 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); }}} == # 플랫폼 호환 == 얼마 전 리눅스에서 store로 저장한 데이타를 윈도우에서 읽으려 했더니 ''Byte order is not compatible at...''라는 메시지가 뜨면서 죽더라. 문서를 살펴보니 store는 기본적으로 해당 플랫폼에서 C언어가 사용하는 데이타타입의 바이트 순서와 사이즈를 그대로 사용해서 저장하는 듯하다 (속도 때문에). 그래서 호환되지 않는 플랫폼에 가면 바이트 오더나 사이즈가 달라서 읽어들이지 못한다. 대신 네트워크 오더를 사용하여 저장하게 할 수 있는데, store 나 store_fd 등 저장하는 함수 이름 앞에 "n"을 붙여서
nstore
와 같이 쓰면 된다. 읽을 때는 저장 포맷을 판별하여 자동으로 읽기 때문에
retrieve
를 그냥 쓸 수 있다. 문서에 의하면 네트워크 오더를 사용할 경우 단점은 * 읽고 쓰는 속도가 느리다 (매번 변환해야 함) * double 형 실수들은 해당 숫자를 텍스트로 변환해서 저장하므로 유효숫자 마지막 자리에 오차가 생긴다. * infinity 나 Not a Number 의 경우도 정확히 저장-복원되지 않을 수 있다. 저장된 데이타가 어떤 포맷으로 저장된 건지는 다음과 같이 확인할 수 있다. {{{#!vim perl $info = Storable::file_magic( $filename ) }}}
$info
에는 해시 레퍼런스가 저장되고, 파일이 네트워크 오더로 저장된 경우에는 이 해시에
netorder => 1
키/값 쌍이 생긴다. 네트워크 오더가 아닐 경우는 대신
byteorder
,
intsize
등의 정보가 해시에 추가된다. 내 경우는 리눅스 쪽에서 일단 파일을 다시 읽고 nstore로 저장하게 한 후, 그 새로 저장된 파일을 윈도우로 가져와서 사용하였다. == # Comments ==
----
---- [[컴퓨터분류]]
Perl/Storable
페이지로 돌아가기 |
다른 수정본 보기