マスタリングPerl (14章 データ永続性)

pack/unpack

pack関数は、テンプレート文字列を使って、データを単一な文字列に変える。
データの取り出しには、unpack関数を使用する。
変換する文字列の長さを指定すると必ず指定長になるので、seekやsysreadで正確なバイト数を読み出すことが可能。

Data::Dumper

Dumper関数で、データ構造のシリアライズ化ができる。
Dumper関数には、文字列化するリファレンスのリストを引き渡す。
evalの文字列形式を使って、データを読み出すことができる。

Data::Dump::Streamer

Dumpでデータのシリアライズ化ができる。
レキシカル変数と無名サブルーチンのコードを取得できる。
コードリファレンスが参照する全ての変数は、同じスコープに現れる。
データの読み出しについては、evalによる変数の作成はできないため、evalの結果を変数に格納する必要がある。

YAML(YAML Ain't Markup Language)

Dumpでデータをシリアライズ化し、Loadで読み出す。

Storable

  • store/retrieve

store関数でデータをシリアライズ化し、retrieve関数で読み出す。
データはバイト形式で保存される。
データのバイト順はアーキテクチャに依存するのでアーキテクチャが違うと読み出せないが、nstore関数を使用すればアーキテクチャ依存フォーマットを回避できる。

freeze関数は、データを固めてスカラーに格納できる。
データをファイルに格納する必要はなく、On Memoryでの処理が可能。
データの読み出しには、thaw関数を使用する。(thaw関数を使用すると、完全に新しいデータ構造として戻る。)
nstore関数同様、nfreeze関数でアーキテクチャ依存フォーマットを回避できる。
freeze関数で固められたデータを格納したスカラーをコピーすると、コピー先は同じリファレンスとなるので、一方のデータを変更すると他方にも影響する。
完全なコピーを行う場合は、freeze後すぐにthawしてから格納する。(dclone関数でも同じ処理が可能。)

#!/usr/bin/perl

use strict;
use warnings;
use Storable qw(nfreeze thaw);

my $deep_copy = thaw(nfreeze($data));
# dcloneでも同じ
my $deep_copy = dclone $data;

DBM

  • dbmopen

データフォーマットは、Perlバイナリのコンパイルオプションに依存するため、他のマシンでは読み取れない可能性がある。

  • DBM::Deep

Pure Perlで実装されているので、機種依存は考慮しなくて良い。
トランザクションをサポートしている。