Storable-2.05 > Storable
Storable-2.05
Other versions:
Storable-2.20

名前

Storable - persistence for Perl data structures

Storable - Perlデータ構造体の永続化

概要

 use Storable;
 store \%table, 'file';
 $hashref = retrieve('file');

 use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
 # Network order
 nstore \%table, 'file';
 $hashref = retrieve('file');   # There is NO nretrieve()
 # ネットワーク様式
 nstore \%table, 'file';
 $hashref = retrieve('file');   # There is NO nretrieve()
 # Storing to and retrieving from an already opened file
 store_fd \@array, \*STDOUT;
 nstore_fd \%table, \*STDOUT;
 $aryref = fd_retrieve(\*SOCKET);
 $hashref = fd_retrieve(\*SOCKET);
 # 既にオープンされているファイルへ格納し、取込ます
 store_fd \@array, \*STDOUT;
 nstore_fd \%table, \*STDOUT;
 $aryref = fd_retrieve(\*SOCKET);
 $hashref = fd_retrieve(\*SOCKET);
 # Serializing to memory
 $serialized = freeze \%table;
 %table_clone = %{ thaw($serialized) };
 # メモリへのシリアライズ
 $serialized = freeze \%table;
 %table_clone = %{ thaw($serialized) };
 # Deep (recursive) cloning
 $cloneref = dclone($ref);
 # 深い(再帰的な)複写
 $cloneref = dclone($ref);
 # Advisory locking
 use Storable qw(lock_store lock_nstore lock_retrieve)
 lock_store \%table, 'file';
 lock_nstore \%table, 'file';
 $hashref = lock_retrieve('file');
 # アドバイザリ・ロック
 use Storable qw(lock_store lock_nstore lock_retrieve)
 lock_store \%table, 'file';
 lock_nstore \%table, 'file';
 $hashref = lock_retrieve('file');

説明

The Storable package brings persistence to your Perl data structures containing SCALAR, ARRAY, HASH or REF objects, i.e. anything that can be conveniently stored to disk and retrieved at a later time.

Storableパッケージは、スカラー(SCALAR)、配列(ARRAY)、ハッシュ(HASH)、 オブジェクトのリファレンス(REF)を持ったPerlのデータ構造体を永続化します。 つまり簡単にディスクに格納し、後で取り込むことを可能にします。

It can be used in the regular procedural way by calling store with a reference to the object to be stored, along with the file name where the image should be written.

格納するオブジェクトへのリファレンスとイメージが書き込まれるファイル名を 指定してstoreを呼び出すという、通常の手続き的な方法で使うことが出来ます。

The routine returns undef for I/O problems or other internal error, a true value otherwise. Serious errors are propagated as a die exception.

そのルーチンはI/O障害や他の内部エラーが発生するとundefを返し、 そうでなければtrueを返します。重大なエラーはdie例外で伝えられます。

To retrieve data stored to disk, use retrieve with a file name. The objects stored into that file are recreated into memory for you, and a reference to the root object is returned. In case an I/O error occurs while reading, undef is returned instead. Other serious errors are propagated via die.

ディスクに格納されたデータを取り込むには、ファイル名を付けてretrieveを 使います。そしてそのファイルに格納されたオブジェクトはメモリ上に再生成されます。 元になるオブジェクトへのリファレンスが返されます。読込の途中で I/Oエラーが発生すると、undefが代わりに返されます。 他の重大なエラーの場合には、エラーがdieを通じて伝えられます。

Since storage is performed recursively, you might want to stuff references to objects that share a lot of common data into a single array or hash table, and then store that object. That way, when you retrieve back the whole thing, the objects will continue to share what they originally shared.

格納が再帰的に行われるので、共通のデータの多くを共有しているオブジェクトへの リファレンスたちを1つの配列またはハッシュテーブルに詰め込んでしまい、 そのオブジェクトを格納したいと思うかもしれません。この方法では、全体を 取り込んだときに、元々共有していたものを引き続き共有します。

At the cost of a slight header overhead, you may store to an already opened file descriptor using the store_fd routine, and retrieve from a file via fd_retrieve. Those names aren't imported by default, so you will have to do that explicitly if you need those routines. The file descriptor you supply must be already opened, for read if you're going to retrieve and for write if you wish to store.

ヘッダにちょっと手をいれると、store_fdルーチンを使って既に開いている ファイル記述子に格納し、fd_retrieveを通じてファイルから取り出すことが できます。それらの名前はデフォルトではインポートされません。そのため、 これらのルーチンが必要であれば、明示的にインポートしなければいけません。 指定するファイル記述子は、取り込むつもりであれば読み込みread)で、 格納するつもりであれば書き込み(write)で、既に開かれていなければなりません。

        store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
        $hashref = fd_retrieve(*STDIN);

You can also store data in network order to allow easy sharing across multiple platforms, or when storing on a socket known to be remotely connected. The routines to call have an initial n prefix for network, as in nstore and nstore_fd. At retrieval time, your data will be correctly restored so you don't have to know whether you're restoring from native or network ordered data. Double values are stored stringified to ensure portability as well, at the slight risk of loosing some precision in the last decimals.

複数のプラットホームで共有することを簡単にしたり、リモートに接続されている ことが分かっているソケットに格納するときに、ネットワーク様式で格納することも 出来ます。呼び出すルーチンにはnstorenstore_fdのように、頭にnetworkを 表すnが付きます。取り込むときはデータが正しく元に戻るので、取り込むのが ネイティブからなのか、ネットワーク様式のデータからなのかを知る必要は ありません。double(倍精度浮動小数点数型)の値も移植性が保証されるように 文字列化されます。ただし最後の桁の精度が若干失われる危険性があります。

When using fd_retrieve, objects are retrieved in sequence, one object (i.e. one recursive tree) per associated store_fd.

retrieve_fdを使うとき、オブジェクトは、対応するstore_fd毎、 1つのオブジェクト(つまり1つの再帰ツリー)を順番に取り込まれます。

If you're more from the object-oriented camp, you can inherit from Storable and directly store your objects by invoking store as a method. The fact that the root of the to-be-stored tree is a blessed reference (i.e. an object) is special-cased so that the retrieve does not provide a reference to that object but rather the blessed object reference itself. (Otherwise, you'd get a reference to that blessed object).

さらにオブジェクト指向陣営寄りであれば、Storableを継承して、 storeをメソッドとして呼び出すことにより、あなたのオブジェクトを 直接格納することができます。格納されるツリーの元がblessされた リファレンス(つまりオブジェクト)であれば、特別なケースになります。 そのため取込は、そのオブジェクトへのリファレンスを提供せず、 blessされたオブジェクト・リファレンスを提供します。 (そうでなければ、そのblessされたオブジェクトへのリファレンスを 取得することにでしょう)

メモリへの格納

The Storable engine can also store data into a Perl scalar instead, to later retrieve them. This is mainly used to freeze a complex structure in some safe compact memory place (where it can possibly be sent to another process via some IPC, since freezing the structure also serializes it in effect). Later on, and maybe somewhere else, you can thaw the Perl scalar out and recreate the original complex structure in memory.

Storableエンジンは後から取り込むために、Perlスカラーにデータを格納する こともできます。これは主に複雑な構造体を安全で小さなメモリ空間に 固めるため(freeze)に使われます(構造体を固めると実際にはシリアライズも されるので、他のプロセスにIPCを通じて送ることも潜在的には可能です)。 後で、そして多分どこか別のところで、Perlスカラを解凍(thaw)し、 元の複雑な構造体をメモリ上に再生成することができます。

Surprisingly, the routines to be called are named freeze and thaw. If you wish to send out the frozen scalar to another machine, use nfreeze instead to get a portable image.

驚いたことに、呼ばれるルーチンの名前はfreezethawといいます。 もし固めたスカラを他のマシンに送信したければ、代わりにnfreezeを ポータブルなイメージを取得してください。

Note that freezing an object structure and immediately thawing it actually achieves a deep cloning of that structure:

オブジェクト構造を固め、すぐに解凍すると、実際には、その構造を深く 複写することを実現していることに注意して下さい:

    dclone(.) = thaw(freeze(.))

Storable provides you with a dclone interface which does not create that intermediary scalar but instead freezes the structure in some internal memory space and then immediately thaws it out.

Storableは、中間のスカラを作成することなく、代わりに内部メモリ空間に 構造を固め、すぐに解凍するdcloneインターフェイスを提供しています。

アドバイザリ・ロック

The lock_store and lock_nstore routine are equivalent to store and nstore, except that they get an exclusive lock on the file before writing. Likewise, lock_retrieve does the same as retrieve, but also gets a shared lock on the file before reading.

lock_storelock_nstorestorenstoreと同じです。ただし、 書き込む前に占有ロックを行います。同様にlock_retrieveretrieveのように 動きます。しかし読み込む前に共有ロックを行います。

As with any advisory locking scheme, the protection only works if you systematically use lock_store and lock_retrieve. If one side of your application uses store whilst the other uses lock_retrieve, you will get no protection at all.

全てのアドバイザリ・ロックのスキームと同じように、保護はあなたが システマティックにlock_storelock_retrieveを使うときにだけ機能します。 もし他の部分がlock_retrieveを使っているときに、あなたのアプリケーションの ある部分がstoreを使うと、何も保護されません。

The internal advisory locking is implemented using Perl's flock() routine. If your system does not support any form of flock(), or if you share your files across NFS, you might wish to use other forms of locking by using modules such as LockFile::Simple which lock a file using a filesystem entry, instead of locking the file descriptor.

アドバイザリ・ロックの内部はPerlのflock()ルーチンを使って実装されます。 もしあなたのシステムがflock()のいかなる形式もサポートしていなかったり、 あなたのファイルをNFS越しにファイルを共有しているのであれば、ファイル記述子ではなく ファイルシステムのエントリを使ってロックするLockFile:Simpleのようなモジュールを 使って他の形式のロックを使いたいことでしょう。

スピード

The heart of Storable is written in C for decent speed. Extra low-level optimizations have been made when manipulating perl internals, to sacrifice encapsulation for the benefit of greater speed.

スピードを上げるため、Storableの中核部分はCで書かれています。 Perl内部を操作するとき、 よりスピードを上げるためにカプセル化を犠牲にするという、特別な低レベルの最適化がな されています。

規範形式

Normally, Storable stores elements of hashes in the order they are stored internally by Perl, i.e. pseudo-randomly. If you set $Storable::canonical to some TRUE value, Storable will store hashes with the elements sorted by their key. This allows you to compare data structures by comparing their frozen representations (or even the compressed frozen representations), which can be useful for creating lookup tables for complicated queries.

通常StorableはハッシュをPerlが内部的に格納している順序で要素を格納します。つまり 疑似ランダムになります。もし$Storable::canonicalTRUE値に設定すると、 Storableはハッシュをそのキーの順に要素を格納します。これにより、データ構造体を 固められた形式で(または固められ圧縮され形式でさえ)比較することができるように なります。これは複雑な問い合わせのための参照テーブルを作るのに便利でしょう。

Canonical order does not imply network order; those are two orthogonal settings.

規範様式(=Canonical)はネットワーク様式を意味していません。それらはまったく違う設定です。

コード・リファレンス

Since Storable version 2.05, CODE references may be serialized with the help of B::Deparse. To enable this feature, set $Storable::Deparse to a true value. To enable deserializazion, $Storable::Eval should be set to a true value. Be aware that deserialization is done through eval, which is dangerous if the Storable file contains malicious data. You can set $Storable::Eval to a subroutine reference which would be used instead of eval. See below for an example using a Safe compartment for deserialization of CODE references.

Storable バージョン 2.05から、コード(CODE)リファレンスがB::Deparseの 助けを借りてシリアライズできます。この機能を有効にするためには、 $Storable::Deparseをtrue値に設定してください。 デシリアライゼーションを有効にするためには、$Storable::Evalがtrue値に 設定されていなければなりません。デシリアライゼーションがevalを通して 行われることに注意してください。もしStorableファイルに悪意のあるデータが 入っていると危険です。$Storable::Evalevalの代わりに使われる サブルーチン・リファレンスを設定することができます。 コード(CODE)リファレンスのデシリアライゼーションについては、Safe コンポーネントを使っている下記の例をご覧ください。

将来への互換性

This release of Storable can be used on a newer version of Perl to serialize data which is not supported by earlier Perls. By default, Storable will attempt to do the right thing, by croak()ing if it encounters data that it cannot deserialize. However, the defaults can be changed as follows:

今回のStorableのリリースでは、Perlのより新しいバージョンで以前のPerlでは サポートされていなかったデータをシリアライズするために使うことができます。 デフォルトではStorableは適切なことをしようとし、デシリアライズできない データにぶつかったらcroak()します。しかしデフォルトは以下のように 変更することができます:

utf8 data

(utf8データ)

Perl 5.6 added support for Unicode characters with code points > 255, and Perl 5.8 has full support for Unicode characters in hash keys. Perl internally encodes strings with these characters using utf8, and Storable serializes them as utf8. By default, if an older version of Perl encounters a utf8 value it cannot represent, it will croak(). To change this behaviour so that Storable deserializes utf8 encoded values as the string of bytes (effectively dropping the is_utf8 flag) set $Storable::drop_utf8 to some TRUE value. This is a form of data loss, because with $drop_utf8 true, it becomes impossible to tell whether the original data was the Unicode string, or a series of bytes that happen to be valid utf8.

Perl 5.6 は255よりも大きなコード値を持つUnicode文字のサポートが加わりました。 そしてPerl5.8では、ハッシュキーでのフルサポートを持ちます。Perlは内部的に、 これらの文字を持つ文字列をutf8を使ってエンコードします。Storableはutf8として、 それらをシリアライズします。デフォルトでは、より古いバージョンがそれが 表すことが出来ないutf8の値にぶつかると、それはcroak()します。Storableが utf8をバイトの文字列としてエンコードされたものとしてデシリアライズするよう、 この動きを変更するためには、$Storable::drop_utf8を何らかのTRUEの値に 設定してください。これはデータが失われることになります。 というのも$drop_utf8がtrueであると、もとのデータがUnicode文字列だったのか、 たまたまutf8として正しいバイトの並びだったのかが分からなくなってしまいます。

restricted hashes

(限定ハッシュ)

Perl 5.8 adds support for restricted hashes, which have keys restricted to a given set, and can have values locked to be read only. By default, when Storable encounters a restricted hash on a perl that doesn't support them, it will deserialize it as a normal hash, silently discarding any placeholder keys and leaving the keys and all values unlocked. To make Storable croak() instead, set $Storable::downgrade_restricted to a FALSE value. To restore the default set it back to some TRUE value.

Perl 5.8は限定ハッシュ(restricted hash) のサポートを追加します。 それは与えられた集合にのみキーが制限され、値を読込のみにロックすることが 出来ます。デフォルトではそれらをサポートしていないperlではStorableが 限定ハッシュにぶつかると、それを通常のハッシュとしてデシリアライズします。 場所を保持するためのキーを全て黙って処分し、キーと値のロックを全て外します。 代わりにStorableにcroak()させるためには、$Storable::downgrade_restrictedFALSEの値に設定してください。デフォルトの設定に戻すためには何らかのTRUE値に 戻してください。

files from future versions of Storable

(将来のバージョンのStorableからのファイル)

Earlier versions of Storable would immediately croak if they encountered a file with a higher internal version number than the reading Storable knew about. Internal version numbers are increased each time new data types (such as restricted hashes) are added to the vocabulary of the file format. This meant that a newer Storable module had no way of writing a file readable by an older Storable, even if the writer didn't store newer data types.

以前のStorableは、読んでいるStorableが知っているものより高い内部バージョンを 持ったファイルにぶつかるとすぐにcroakしました。内部バージョン番号は新しいデータ型 (限定ハッシュのような)がファイル形式の用語に加えられるたびに上がります。これは より新しいStorableモジュールには、たとえ新しいデータ型を格納しなかったとしても、 古いStorableで読めるようなファイルを書く方法がないことを意味します。

This version of Storable will defer croaking until it encounters a data type in the file that it does not recognize. This means that it will continue to read files generated by newer Storable modules which are careful in what they write out, making it easier to upgrade Storable modules in a mixed environment.

Storableのこのバージョンは、ファイルの中で、それが理解しないデータ型にぶつかるまで croakしないという点で異なります。つまりこれは出力するものに注意を払えば、 新しいStorableモジュールで作られたファイルでも読むことが出来るということです。 これにより混在する環境でStorableをアップグレードすることが簡単になります。

The old behaviour of immediate croaking can be re-instated by setting $Storable::accept_future_minor to some FALSE value.

$Storable::accept_future_minorFALSE値にすることにより、即座にcroakする というStorableの古い動きに戻すことが出来ます。

All these variables have no effect on a newer Perl which supports the relevant feature.

これらの変数は関連する機能をサポートしている新しいPerlでは何の効果もありません。

エラー・レポート

Storable uses the "exception" paradigm, in that it does not try to workaround failures: if something bad happens, an exception is generated from the caller's perspective (see Carp and croak()). Use eval {} to trap those exceptions.

Storableは"例外"パラダイムを使っています。それでは障害を回避しようとはしません: 何かよくないことが発生したら、呼び出した側の視点で例外が発生します (Carpcroak()をご覧ください)。それらの例外を捕らえるためにはeval{}を 使ってください。

When Storable croaks, it tries to report the error via the logcroak() routine from the Log::Agent package, if it is available.

Storableがcroakするとき、Log::Agentパッケージが利用できるのであれば、 そのlogcroak()ルーチンを経由してエラーを報告しようとします。

Normal errors are reported by having store() or retrieve() return undef. Such errors are usually I/O errors (or truncated stream errors at retrieval).

通常のエラーはstorable()やretrieve()にundefを返すことにより報告されます。 そのようなエラーは通常I/Oのエラー(あるいはretrieveのさいにストリームが 切り捨てられたか)です。

上級者のみ

フック

Any class may define hooks that will be called during the serialization and deserialization process on objects that are instances of that class. Those hooks can redefine the way serialization is performed (and therefore, how the symmetrical deserialization should be conducted).

全てのクラスで、そのクラスのインスタンスをシリアライズやデシリアライズの 処理の途中で呼ばれるフックを定義することもできます。それらのフックは 実行されるシリアライゼーションを実行する方法を再定義することが出来ます。 (そのため、対になるデシリアライゼーションも、そのように振舞わなければ なりません)

Since we said earlier:

前述の通り:

    dclone(.) = thaw(freeze(.))

everything we say about hooks should also hold for deep cloning. However, hooks get to know whether the operation is a mere serialization, or a cloning.

フックについて述べたことはすべて、深いクローン作成にも当てはまります。 しかしフックには、その処理が単なるシリライゼーションなのかクローンなのかが わかります。

Therefore, when serializing hooks are involved,

このため、シリアライズ化のフックが呼び出されるとになります。

    dclone(.) <> thaw(freeze(.))

Well, you could keep them in sync, but there's no guarantee it will always hold on classes somebody else wrote. Besides, there is little to gain in doing so: a serializing hook could keep only one attribute of an object, which is probably not what should happen during a deep cloning of that same object.

同期を取ることもできます。しかし誰か他の人が書いたクラスについて常に 当てはまるような保証はありません。さらに、そうすることによって得られるものは あまりありません:シリアライズのフックは、あるオブジェクトの1つの属性を 保持することだけができます。それは、その同じオブジェクトの深い複写の間に起きる こととは多分、違います。

Here is the hooking interface:

以下にフックのインターフェイスを示します:

STORABLE_freeze obj, cloning

The serializing hook, called on the object during serialization. It can be inherited, or defined in the class itself, like any other method.

シリアライズ化フック。オブジェクトがシリアライズされるときに呼ばれます。 これは他のメソッドと同様に継承したり、クラスの中で再定義することができます。

Arguments: obj is the object to serialize, cloning is a flag indicating whether we're in a dclone() or a regular serialization via store() or freeze().

引数:objはシリアラズするオブジェクト、cloningはdclone()の中であるか、 store()やfreeze()を経由した通常のシリアライゼーションかを示します。

Returned value: A LIST ($serialized, $ref1, $ref2, ...) where $serialized is the serialized form to be used, and the optional $ref1, $ref2, etc... are extra references that you wish to let the Storable engine serialize.

戻り値:リスト ($serialized, $ref1, $ref2, ...) 。 $serialized は、 使われるシリアライズされた形式、オプションの$ref1、$ref2などは、 Storableエンジンにシリアラズさせたい特別なリファレンスです。

At deserialization time, you will be given back the same LIST, but all the extra references will be pointing into the deserialized structure.

デシリアライゼーションのときには、あなたは同じリスト(LIST)が与えられます。 しかし特別なリファレンスは全てデシリアライズされた構造体を示します。

The first time the hook is hit in a serialization flow, you may have it return an empty list. That will signal the Storable engine to further discard that hook for this class and to therefore revert to the default serialization of the underlying Perl data. The hook will again be normally processed in the next serialization.

最初にフックがシリアライゼーションの流れの中でヒットしたとき、 あなたは空のリストを返すことができます。それはこのクラスのためのフックを、 それから先、捨てらるようStorableエンジンに合図し、このため元になっている Perlデータのデフォルトのシリアライゼーションに戻ります。そのフックは次の シリアライゼーションでは再び通常通り処理されます。

Unless you know better, serializing hook should always say:

よく分からなければ、シリアライズの フックは以下のようにするべきです:

    sub STORABLE_freeze {
        my ($self, $cloning) = @_;
        return if $cloning;         # Regular default serialization
        ....
    }
    sub STORABLE_freeze {
        my ($self, $cloning) = @_;
        return if $cloning;         # 通常のデフォルトのシリアライゼーション
        ....
    }

in order to keep reasonable dclone() semantics.

dclone()セマンティクスでも合理的になるようにします。

STORABLE_thaw obj, cloning, serialized, ...

The deserializing hook called on the object during deserialization. But wait: if we're deserializing, there's no object yet... right?

オブジェクトがデシリアライズされるときに呼ばれるデシリアライズ化フック。 しかし待ってください: もしデシリアライズしているのであれば、 オブジェクトはまだないのでは...?

Wrong: the Storable engine creates an empty one for you. If you know Eiffel, you can view STORABLE_thaw as an alternate creation routine.

違います:Storableエンジンはあなたのために空のものを生成します。 Eiffelをご存知であれば、STORABLE_thawは代替生成ルーチンとして みることが出来ます。

This means the hook can be inherited like any other method, and that obj is your blessed reference for this particular instance.

つまり、フックは他のメソッドと同じように継承することができ、 objはこの特定のインスタンスのためのblessされたリファレンスになります。

The other arguments should look familiar if you know STORABLE_freeze: cloning is true when we're part of a deep clone operation, serialized is the serialized string you returned to the engine in STORABLE_freeze, and there may be an optional list of references, in the same order you gave them at serialization time, pointing to the deserialized objects (which have been processed courtesy of the Storable engine).

その他の引数はSTORABLE_freezeを知っていれば慣れているでしょう:深い クローン処理の一部であればcloningはtrueになります。serializedSTORABLE_freezeでエンジンに返したシリアライズされた文字列です。 そしてオプションのリファレンスのリストもあるかもしれません。 それはシリアル化のときにあなたが与えた順番で、デシリアライズされた オブジェクトを指します(それらはStorableエンジンによって特別に扱われます)

When the Storable engine does not find any STORABLE_thaw hook routine, it tries to load the class by requiring the package dynamically (using the blessed package name), and then re-attempts the lookup. If at that time the hook cannot be located, the engine croaks. Note that this mechanism will fail if you define several classes in the same file, but perlmod warned you.

Storableエンジンが何もSTORABLE_thawフック・ルーチンを見つけられなければ、 それは動的にパッケージを(blessされたパッケージ名を使って)requireすることにより ロードしようとします。そして再び参照しようとします。もしこの時点で フックが見つからなければ、エンジンはcroakします。この仕組は同じファイルで いくつものクラスを定義しているとうまくいきません。しかしperlmodが警告 するでしょう。

It is up to you to use this information to populate obj the way you want.

これらの情報を使って、どのようにobjを作成するかは、あなた次第です。

Returned value: none.

戻り値:ありません。

述語

Predicates are not exportable. They must be called by explicitly prefixing them with the Storable package name.

述語(Predicates)はエクスポート可能ではありません。それらはStorableパッケージ名を 明示的に前につけて呼び出されなければなりません。

Storable::last_op_in_netorder

The Storable::last_op_in_netorder() predicate will tell you whether network order was used in the last store or retrieve operation. If you don't know how to use this, just forget about it.

述語Storable::last_op_in_netorder()は、最後のstoreあるいはretrieve操作のさい ネットワーク・オーダーであったかを示します。もしこの使い方がわからなければ、 忘れてください。

Storable::is_storing

Returns true if within a store operation (via STORABLE_freeze hook).

(STORABLE_freezeフックを経由して)store操作の中であればtrueを返します。

Storable::is_retrieving

Returns true if within a retrieve operation (via STORABLE_thaw hook).

(STORABLE_thawフックを経由して)retrieve操作の中であればtrueを返します。

再帰

With hooks comes the ability to recurse back to the Storable engine. Indeed, hooks are regular Perl code, and Storable is convenient when it comes to serializing and deserializing things, so why not use it to handle the serialization string?

フックによってStorableエンジンに再帰的に戻ってくることが可能になります。 実際、フックは通常のPerlコードです。そしてStorableは、あるものをシリアライズ したりデシリアライズするときに便利です。それならば、シリアライズされた 文字列を扱うために、それを使っていけないなんてことあるんでしょうか?

There are a few things you need to know, however:

しかしいくつか覚えておかなければならないことがあります:

  • You can create endless loops if the things you serialize via freeze() (for instance) point back to the object we're trying to serialize in the hook.

    もしfreeze()でシリアライズしようとしているものが、(例えば)フックの中で シリアライズしようとしているオブジェクトを指しているとすると無限ループを 作ってしまうかもしれません。

  • Shared references among objects will not stay shared: if we're serializing the list of object [A, C] where both object A and C refer to the SAME object B, and if there is a serializing hook in A that says freeze(B), then when deserializing, we'll get [A', C'] where A' refers to B', but C' refers to D, a deep clone of B'. The topology was not preserved.

    オブジェクト間で共有される参照は共有されなくなります:オブジェクトAとCの両方が 同じオブジェクトBを参照しているとき、オブジェクトのリスト[A, C]をシリアライズし、 そしてAにfreeze(B)と書いてあるシリアライズのためのフックがあるなば、、 デシリアライズすると、[A', C']を取得し、A'はB'を参照します。しかしC'はB'の 深いクローンであるDを参照します。位相は保持されません。

That's why STORABLE_freeze lets you provide a list of references to serialize. The engine guarantees that those will be serialized in the same context as the other objects, and therefore that shared objects will stay shared.

このためにSTORABLE_freezeはシリアライズするリファレンスのリストを提供させて いるのです。エンジンは他のオブジェクトと同じコンテキストの中で、それらが シリアライズされることを、そのため共有されたオブジェクトは共有されたままに なることを保証します。

In the above [A, C] example, the STORABLE_freeze hook could return:

上記の[A, C]の例では、STORABLE_freezeフックは以下のように返すことができます:

        ("something", $self->{B})

and the B part would be serialized by the engine. In STORABLE_thaw, you would get back the reference to the B' object, deserialized for you.

そしてB部分はエンジンによってシリアライズされます。STORABLE_thawでは、 デシリアライズされたB'オブジェクトへのリファレンスを取得するでしょう。

Therefore, recursion should normally be avoided, but is nonetheless supported.

このため再帰は通常は避けられるはずです。しかしそれでもサポートされています。

深いクローン作成

There is a Clone module available on CPAN which implements deep cloning natively, i.e. without freezing to memory and thawing the result. It is aimed to replace Storable's dclone() some day. However, it does not currently support Storable hooks to redefine the way deep cloning is performed.

CPANから、深いクローン作成をネイティブに、つまりメモリ上に固め、 その結果を解凍することがなしに実装する新しいCloneモジュールが利用できます。 それは将来、Storableのdclone()を置き換えることを目標にしています。 しかし、実行される深いクローン作成の方法を再定義するためのStorableフックは、 まだサポートしていません。

Storableのmagic

Yes, there's a lot of that :-) But more precisely, in UNIX systems there's a utility called file, which recognizes data files based on their contents (usually their first few bytes). For this to work, a certain file called magic needs to taught about the signature of the data. Where that configuration file lives depends on the UNIX flavour; often it's something like /usr/share/misc/magic or /etc/magic. Your system administrator needs to do the updating of the magic file. The necessary signature information is output to STDOUT by invoking Storable::show_file_magic(). Note that the GNU implementation of the file utility, version 3.38 or later, is expected to contain support for recognising Storable files out-of-the-box, in addition to other kinds of Perl files.

そう、それはたくさん:-)。しかしより正確には、UNIXシステムではfileと 呼ばれるユーティリティがあります。それはその内容(通常はその先頭の数バイト)を ベースにデータファイルを評価します。これが機能するためには、magicと呼ばれる、 あるファイルがそのデータの特徴(signature)について教える必要があります。 その構成設定ファイルがある場所はUNIXの好みに依存し、/usr/share/misc/magic/etc/magicのようなところによくあります。あなたのシステム管理者はmagic ファイルを更新する必要があります。必要な特徴情報はStorable::show_file_magic()を 呼び出すことによりSTDOUTへ出力されます。fileユーティリティ3.38以降の GNUの実装には、他の種類のPerlファイルに加えて、Stoableファイルを評価するための サポートが入っていると期待することができます。

Here are some code samples showing a possible usage of Storable:

Storableの使用法を示すコード・サンプルを以下に示します:

        use Storable qw(store retrieve freeze thaw dclone);

        %color = ('Blue' => 0.1, 'Red' => 0.8, 'Black' => 0, 'White' => 1);

        store(\%color, '/tmp/colors') or die "Can't store %a in /tmp/colors!\n";

        $colref = retrieve('/tmp/colors');
        die "Unable to retrieve from /tmp/colors!\n" unless defined $colref;
        printf "Blue is still %lf\n", $colref->{'Blue'};

        $colref2 = dclone(\%color);

        $str = freeze(\%color);
        printf "Serialization of %%color is %d bytes long.\n", length($str);
        $colref3 = thaw($str);

which prints (on my machine):

(私のマシンでの)出力結果:

        Blue is still 0.100000
        Serialization of %color is 102 bytes long.

Serialization of CODE references and deserialization in a safe compartment:

Safeコンポーネント内でのコード(CODE)リファレンスのシリアライゼーションと デシリアライゼーション:

        use Storable qw(freeze thaw);
        use Safe;
        use strict;
        my $safe = new Safe;
        # permitting the "require" opcode is necessary when using "use strict"
        $safe->permit(qw(:default require));
        local $Storable::Deparse = 1;
        local $Storable::Eval = sub { $safe->reval($_[0]) };
        my $serialized = freeze(sub { print "42\n" });
        my $code = thaw($serialized);
        $code->(); # prints 42
        use Storable qw(freeze thaw);
        use Safe;
        use strict;
        my $safe = new Safe;
        # opcodeを"require"することを許すことは"use strict"を使う時には必須です
        $safe->permit(qw(:default require));
        local $Storable::Deparse = 1;
        local $Storable::Eval = sub { $safe->reval($_[0]) };
        my $serialized = freeze(sub { print "42\n" });
        my $code = thaw($serialized);
        $code->(); # prints 42

WARNING

If you're using references as keys within your hash tables, you're bound to be disappointed when retrieving your data. Indeed, Perl stringifies references used as hash table keys. If you later wish to access the items via another reference stringification (i.e. using the same reference that was used for the key originally to record the value into the hash table), it will work because both references stringify to the same string.

ハッシュテーブルのキーとしてリファレンスを使っているならば、データを 取り出したときにガッカリするかもしれません。実際のところPerlは ハッシュのキーとして使われているリファレンスを文字列化します。 もし後で他のリファレンスの文字列化を通じて(つまり元々、 ハッシュテーブルのなかに値を記録するためにキーとして使われたものと 同じリファレンスを使って)要素にアクセスしたければ、両方のリファレンスが 文字列化されたものが同じ文字列なので機能します。

It won't work across a sequence of store and retrieve operations, however, because the addresses in the retrieved objects, which are part of the stringified references, will probably differ from the original addresses. The topology of your structure is preserved, but not hidden semantics like those.

しかし、storeretieve操作をまたぐと動きません。なぜなら取り込まれた オブジェクトでのアドレス(文字列化されたリファレンスの一部です)が、 おそらく元のアドレスとは違っているからです。構造体の形は保持されますが、 このような隠された意味は保存されません。

On platforms where it matters, be sure to call binmode() on the descriptors that you pass to Storable functions.

問題となるプラットホームでは、Storable関数に渡す記述子にbinmodeを 呼ぶようにして下さい。

Storing data canonically that contains large hashes can be significantly slower than storing the same data normally, as temporary arrays to hold the keys for each hash have to be allocated, populated, sorted and freed. Some tests have shown a halving of the speed of storing -- the exact penalty will depend on the complexity of your data. There is no slowdown on retrieval.

データを規範形式で格納すると、大きなハッシュでは通常にデータを格納するのに 比べて非常に遅くなるかもしれません。というのも各ハッシュのためのキーを 保持するための一時的な配列を占有し、生き延びさせ、ソートし、解放しなければ ならないためです。いくつかのテストでは格納のスピードが半減しました-- どれくらい遅くなるかはデータの複雑さに依存します。取込では遅くなることは ありません。

バグ

You can't store GLOB, CODE, FORMLINE, etc.... If you can define semantics for those operations, feel free to enhance Storable so that it can deal with them.

GLOB, CODE, FORMLINE等は格納することが出来ません。これらの操作のための 意味をはっきり決めたら、それらを扱えるよう自由にStorableを拡張して下さい。

The store functions will croak if they run into such references unless you set $Storable::forgive_me to some TRUE value. In that case, the fatal message is turned in a warning and some meaningless string is stored instead.

store関数は、$Strable::forgive_meをなんらかのTRUE値に設定しておかなければ、 それらのリファレンスに踏み込むとcroakします。その場合、警告で致命的な メッセージが返され、代わりに意味のない文字列が格納されます。

Setting $Storable::canonical may not yield frozen strings that compare equal due to possible stringification of numbers. When the string version of a scalar exists, it is the form stored; therefore, if you happen to use your numbers as strings between two freezing operations on the same data structures, you will get different results.

$Storable::canonicalを設定すると、数値が文字列化される可能性から 同じものであると比較される固められた文字列を作り出さないかもしれません。 スカラーの文字列バージョンが存在するときには、それが格納される形式に なります。このため、もし同じデータ構造の2回固める操作をする間に、 たまたま数値を文字列として使ってしまうと、違う結果になります。

When storing doubles in network order, their value is stored as text. However, you should also not expect non-numeric floating-point values such as infinity and "not a number" to pass successfully through a nstore()/retrieve() pair.

double(倍精度浮動小数点)をネットワーク様式で格納するとき、その値は テキストとして格納されます。しかし、nstore()/retrieve()の組み合わせに 正常に渡すことにより、無限や"数値ではない"ようなのような数値でない 浮動小数点を予想する必要はありません。

As Storable neither knows nor cares about character sets (although it does know that characters may be more than eight bits wide), any difference in the interpretation of character codes between a host and a target system is your problem. In particular, if host and target use different code points to represent the characters used in the text representation of floating-point numbers, you will not be able be able to exchange floating-point data, even with nstore().

Storableは文字集合について知りませんし、気にもしません (それは文字が8ビットよりも大きいかもしれないということは知っています)。 ホストとターゲット・システムでの文字コードの解釈における違いは、 すべてあなたの問題です。特にもしホストとターゲットが浮動小数点数の テキスト形式で異なるコードポイントを使うのであれば、nstore()を使った としても浮動小数点のデータをやりとりできないかもしれません。

Storable::drop_utf8 is a blunt tool. There is no facility either to return all strings as utf8 sequences, or to attempt to convert utf8 data back to 8 bit and croak() if the conversion fails.

Storable::drop_utf8は鈍器のようなものです。それには全ての文字列を utf8の並びとして返すか、utf8データを8ビットに変換しようとし、 変換に失敗したらcroak()する以外に機能はありません。

Prior to Storable 2.01, no distinction was made between signed and unsigned integers on storing. By default Storable prefers to store a scalars string representation (if it has one) so this would only cause problems when storing large unsigned integers that had never been coverted to string or floating point. In other words values that had been generated by integer operations such as logic ops and then not used in any string or arithmetic context before storing.

Storable 2.01より以前、格納時に符号付と符号なし整数での区別はつけられませんでした。 デフォルトではStorableは(もし持っていれば)スカラーを文字列表現を選びます。 そのため文字列や不動賞寸点数に変換されたことがない大きな符号なし整数を格納するとき にだけ問題になります。言い換えれば、論理演算のような整数処理により作成され、 格納の前に何も文字列操作や算術コンテキストで使われなかった値です。

perl 5.6.0 と 5.6.1での64ビット・データ

This section only applies to you if you have existing data written out by Storable 2.02 or earlier on perl 5.6.0 or 5.6.1 on Unix or Linux which has been configured with 64 bit integer support (not the default) If you got a precompiled perl, rather than running Configure to build your own perl from source, then it almost certainly does not affect you, and you can stop reading now (unless you're curious). If you're using perl on Windows it does not affect you.

このセクションは、64ビットinteger(デフォルトではありません)を サポートするように構成設定されているUnixあるいはLinux上のperl5.6.0や5.6.1で Storable2.20あるいはそれ以前によって出力された既存のデータを持っている場合に のみ当てはまります。ソースから独自のperlを構築するためにConfigureを実行する のではなく、既にコンパイルされているperlを取得したのであれば、 それはおそらく何も影響はないでしょう。そして、(あなたが疑問を持っていなければ) ここで読むのを止めることが出来ます。Windowsでperlを使っていれば、何も影響は ありません。

Storable writes a file header which contains the sizes of various C language types for the C compiler that built Storable (when not writing in network order), and will refuse to load files written by a Storable not on the same (or compatible) architecture. This check and a check on machine byteorder is needed because the size of various fields in the file are given by the sizes of the C language types, and so files written on different architectures are incompatible. This is done for increased speed. (When writing in network order, all fields are written out as standard lengths, which allows full interworking, but takes longer to read and write)

Storableは、Storableを構築したCコンパイラのさまざまなC言語の型の大きさが入った ファイルヘッダを出力します。そして同じ(あるいは互換性のある)アーキテクチャでは ないStorableによって書かれたファイルをロードすることを拒絶します。 ファイルの中のさまざまなフィールドはC言語の型の大きさによって与えられ、 そのため異なるアーキテクチャで書かれたファイルは互換性がないので、 このチェックとマシンのバイトオーダーについてのチェックは必要です。 これはスピードを向上させるために行われます(ネットワーク順で出力するとき、 全てのフィールドは標準の長さでかかれます。これは完全にネットワーク越える ことを可能にしますが、読み込みと書込みはより時間がかかります)

Perl 5.6.x introduced the ability to optional configure the perl interpreter to use C's long long type to allow scalars to store 64 bit integers on 32 bit systems. However, due to the way the Perl configuration system generated the C configuration files on non-Windows platforms, and the way Storable generates its header, nothing in the Storable file header reflected whether the perl writing was using 32 or 64 bit integers, despite the fact that Storable was storing some data differently in the file. Hence Storable running on perl with 64 bit integers will read the header from a file written by a 32 bit perl, not realise that the data is actually in a subtly incompatible format, and then go horribly wrong (possibly crashing) if it encountered a stored integer. This is a design failure.

Perl 5.6.x は、perlインタープリタが32ビット・システムで64ビットintegerを 格納できるスカラを可能にするCのlong long型を使う、オプションの構成設定の 機能を導入しました。しかしWindowsプラットホーム以外で Perl構成設定システムがC構成設定ファイルを生成した方法や、 Storableがそのハンドラを生成する方法のために、 Storableは別にいくつかのデータをファイルに格納しているにも関わらず perlが32あるいは64ビットintegerを使って出力したかは、 Storableファイル・ヘッダの内容に反映されません。 このため64ビットintegerでperlを実行しているStorableは32ビットperlによって 出力されたファイルからのヘッダを読み、データが実際には微妙に互換性のない ものであると理解せず、格納されたintegerにぶつかると恐ろしい間違いを起こすでしょう (おそらくはクラッシュしてしまいます)。これは設計上の失敗です。

Storable has now been changed to write out and read in a file header with information about the size of integers. It's impossible to detect whether an old file being read in was written with 32 or 64 bit integers (they have the same header) so it's impossible to automatically switch to a correct backwards compatibility mode. Hence this Storable defaults to the new, correct behaviour.

Storableは現在はintegerの大きさについての情報を持ったファイル・ヘッダを 出力し、読み込むように変更されています。読み込まれた古いファイルが、32ビット integerなのか64ビットなのかを判定することはできません(同じヘッダを持っています)。 そのため自動的に正しい後方互換性モードに自動的に移ることはできません。 そのためStorableはデフォルトでは、新しい正しい動きをになっています。

What this means is that if you have data written by Storable 1.x running on perl 5.6.0 or 5.6.1 configured with 64 bit integers on Unix or Linux then by default this Storable will refuse to read it, giving the error Byte order is not compatible. If you have such data then you you should set $Storable::interwork_56_64bit to a true value to make this Storable read and write files with the old header. You should also migrate your data, or any older perl you are communicating with, to this current version of Storable.

これが意味することは、UnixあるいはLinux上で64ビットintegerで構成設定された perl 5.6.0や5.6.1で実行した Storable 1.xによって書かれたデータを持っている のであれば、デフォルトではこのStorableはそれを読み込むことを拒絶し、 Byte order is not compatible(バイト順に互換性がありません)というエラーに なります。もしそのようなデータを持っているのであれば、 このStorableが古いヘッダを持っているファイルを読み書きできるよう、 $Storable::interwork_56_64bitをtrue値に設定しなければなりません。 あなたデータやあなたが通信する古いperlを、Storableこの現行バージョンに 移すこともしなければなりません。

If you don't have data written with specific configuration of perl described above, then you do not and should not do anything. Don't set the flag - not only will Storable on an identically configured perl refuse to load them, but Storable a differently configured perl will load them believing them to be correct for it, and then may well fail or crash part way through reading them.

上記で記述された特定のperlの構成設定で書かれたデータを持っていなければ、 何もしなくてもいいですし、するべきでもありません。フラグを設定しないでください- 同じように構成設定されたperlでのStorableが、それらをロードすることを拒絶する だけでなく、違うように構成設定されたperlでのStorableが、それらをそれにとって 正しいものと信じてロードし、読み込んでいる途中で失敗したり、クラッシュしてしまいます。

CREDITS

Thank you to (in chronological order):

以下の方に感謝いたします。 (時間順):

        Jarkko Hietaniemi <[email protected]>
        Ulrich Pfeifer <[email protected]>
        Benjamin A. Holzman <[email protected]>
        Andrew Ford <[email protected]>
        Gisle Aas <[email protected]>
        Jeff Gresham <[email protected]>
        Murray Nesbitt <[email protected]>
        Marc Lehmann <[email protected]>
        Justin Banks <[email protected]>
        Jarkko Hietaniemi <[email protected]> (AGAIN, as perl 5.7.0 Pumpkin!)
        Salvador Ortiz Garcia <[email protected]>
        Dominic Dunlop <[email protected]>
        Erik Haugan <[email protected]>

for their bug reports, suggestions and contributions.

バグ報告、提案、貢献がありました。

Benjamin Holzman contributed the tied variable support, Andrew Ford contributed the canonical order for hashes, and Gisle Aas fixed a few misunderstandings of mine regarding the perl internals, and optimized the emission of "tags" in the output streams by simply counting the objects instead of tagging them (leading to a binary incompatibility for the Storable image starting at version 0.6--older images are, of course, still properly understood). Murray Nesbitt made Storable thread-safe. Marc Lehmann added overloading and references to tied items support.

Benjamin Holzman はtieされた変数のサポートに貢献してくれました。 Andrew Ford はハッシュための標準様式に貢献してくれました。 そしてGisle Aas はPerlの内部についての私の誤解を修正し、タグを つける代わりに単純にオブジェクトの数を数えることによって、 出力ストリームでの「タグ」の吐き出しを最適化してくれました。 (これによりバージョン0.6以降でバイナリでのStorableイメージの 互換性をなくすことになりました。しかし古いイメージもまだきちんと 理解されます。)Murray Nesbitt はStorableをスレッド・セーフにしてくれました。 Marc Lehmannはtieされている要素へのオーバーロードと参照のサポートを 追加してくれました。

作者

Storable was written by Raphael Manfredi <[email protected]> Maintenance is now done by the perl5-porters <[email protected]>

StorableはRaphael Manfredi <[email protected]> によって作成されました。 現在、perl5-porters <[email protected]> によってメンテナンスされています。

Please e-mail us with problems, bug fixes, comments and complaints, although if you have complements you should send them to Raphael. Please don't e-mail Raphael with problems, as he no longer works on Storable, and your message will be delayed while he forwards it to us.

たとえRaphaelに送信するべき補足するものを持っていたとしても、障害、バグ修正、 コメント、苦情については私たちにメールしてください。どうか障害についてRaphaeに メールしないでください。彼はもうStorableについて取り組んでいません。 そしてあなたのメッセージは彼が私たちに転送するまで遅れてしまいます。

SEE ALSO

Clone.