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

名前

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 毎、 一つのオブジェクト(つまり一つの再帰ツリー)を順番に取り込まれます。

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 deserialization, $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 コンポーネントを 使っている下記の例をご覧ください。

If $Storable::Deparse and/or $Storable::Eval are set to false values, then the value of $Storable::forgive_me (see below) is respected while serializing and deserializing.

If $Storable::Deparse and/or $Storable::Eval are set to false values, then the value of $Storable::forgive_me (see below) is respected while serializing and deserializing. (TBT)

将来への互換性

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 文字のサポートが 加わりました。 そして Perl 5.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.

戻り値: ありません。

STORABLE_attach class, cloning, serialized

While STORABLE_freeze and STORABLE_thaw are useful for classes where each instance is independent, this mechanism has difficulty (or is incompatible) with objects that exist as common process-level or system-level resources, such as singleton objects, database pools, caches or memoized objects.

While STORABLE_freeze and STORABLE_thaw are useful for classes where each instance is independent, this mechanism has difficulty (or is incompatible) with objects that exist as common process-level or system-level resources, such as singleton objects, database pools, caches or memoized objects. (TBT)

The alternative STORABLE_attach method provides a solution for these shared objects. Instead of STORABLE_freeze --> STORABLE_thaw, you implement STORABLE_freeze --> STORABLE_attach instead.

The alternative STORABLE_attach method provides a solution for these shared objects. Instead of STORABLE_freeze --> STORABLE_thaw, you implement STORABLE_freeze --> STORABLE_attach instead. (TBT)

Arguments: class is the class we are attaching to, cloning is a flag indicating whether we're in a dclone() or a regular de-serialization via thaw(), and serialized is the stored string for the resource object.

Arguments: class is the class we are attaching to, cloning is a flag indicating whether we're in a dclone() or a regular de-serialization via thaw(), and serialized is the stored string for the resource object. (TBT)

Because these resource objects are considered to be owned by the entire process/system, and not the "property" of whatever is being serialized, no references underneath the object should be included in the serialized string. Thus, in any class that implements STORABLE_attach, the STORABLE_freeze method cannot return any references, and Storable will throw an error if STORABLE_freeze tries to return references.

Because these resource objects are considered to be owned by the entire process/system, and not the "property" of whatever is being serialized, no references underneath the object should be included in the serialized string. Thus, in any class that implements STORABLE_attach, the STORABLE_freeze method cannot return any references, and Storable will throw an error if STORABLE_freeze tries to return references. (TBT)

All information required to "attach" back to the shared resource object must be contained only in the STORABLE_freeze return string. Otherwise, STORABLE_freeze behaves as normal for STORABLE_attach classes.

All information required to "attach" back to the shared resource object must be contained only in the STORABLE_freeze return string. Otherwise, STORABLE_freeze behaves as normal for STORABLE_attach classes. (TBT)

Because STORABLE_attach is passed the class (rather than an object), it also returns the object directly, rather than modifying the passed object.

Because STORABLE_attach is passed the class (rather than an object), it also returns the object directly, rather than modifying the passed object. (TBT)

Returned value: object of type class

Returned value: object of type class (TBT)

述語

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 ファイルを評価するためのサポートが入っていると 期待することができます。

You can also use the following functions to extract the file header information from Storable images:

You can also use the following functions to extract the file header information from Storable images: (TBT)

$info = Storable::file_magic( $filename )

If the given file is a Storable image return a hash describing it. If the file is readable, but not a Storable image return undef. If the file does not exist or is unreadable then croak.

If the given file is a Storable image return a hash describing it. If the file is readable, but not a Storable image return undef. If the file does not exist or is unreadable then croak. (TBT)

The hash returned has the following elements:

The hash returned has the following elements: (TBT)

version

This returns the file format version. It is a string like "2.7".

This returns the file format version. It is a string like "2.7". (TBT)

Note that this version number is not the same as the version number of the Storable module itself. For instance Storable v0.7 create files in format v2.0 and Storable v2.15 create files in format v2.7. The file format version number only increment when additional features that would confuse older versions of the module are added.

Note that this version number is not the same as the version number of the Storable module itself. For instance Storable v0.7 create files in format v2.0 and Storable v2.15 create files in format v2.7. The file format version number only increment when additional features that would confuse older versions of the module are added. (TBT)

Files older than v2.0 will have the one of the version numbers "-1", "0" or "1". No minor number was used at that time.

Files older than v2.0 will have the one of the version numbers "-1", "0" or "1". No minor number was used at that time. (TBT)

version_nv

This returns the file format version as number. It is a string like "2.007". This value is suitable for numeric comparisons.

This returns the file format version as number. It is a string like "2.007". This value is suitable for numeric comparisons. (TBT)

The constant function Storable::BIN_VERSION_NV returns a comparable number that represent the highest file version number that this version of Storable fully support (but see discussion of $Storable::accept_future_minor above). The constant Storable::BIN_WRITE_VERSION_NV function returns what file version is written and might be less than Storable::BIN_VERSION_NV in some configuations.

The constant function Storable::BIN_VERSION_NV returns a comparable number that represent the highest file version number that this version of Storable fully support (but see discussion of $Storable::accept_future_minor above). The constant Storable::BIN_WRITE_VERSION_NV function returns what file version is written and might be less than Storable::BIN_VERSION_NV in some configuations. (TBT)

major, minor

This also returns the file format version. If the version is "2.7" then major would be 2 and minor would be 7. The minor element is missing for when major is less than 2.

This also returns the file format version. If the version is "2.7" then major would be 2 and minor would be 7. The minor element is missing for when major is less than 2. (TBT)

hdrsize

The is the number of bytes that the Storable header occupies.

The is the number of bytes that the Storable header occupies. (TBT)

netorder

This is TRUE if the image store data in network order. This means that it was created with nstore() or similar.

This is TRUE if the image store data in network order. This means that it was created with nstore() or similar. (TBT)

byteorder

This is only present when netorder is FALSE. It is the $Config{byteorder} string of the perl that created this image. It is a string like "1234" (32 bit little endian) or "87654321" (64 bit big endian). This must match the current perl for the image to be readable by Storable.

This is only present when netorder is FALSE. It is the $Config{byteorder} string of the perl that created this image. It is a string like "1234" (32 bit little endian) or "87654321" (64 bit big endian). This must match the current perl for the image to be readable by Storable. (TBT)

intsize, longsize, ptrsize, nvsize

These are only present when netorder is FALSE. These are the sizes of various C datatypes of the perl that created this image. These must match the current perl for the image to be readable by Storable.

These are only present when netorder is FALSE. These are the sizes of various C datatypes of the perl that created this image. These must match the current perl for the image to be readable by Storable. (TBT)

The nvsize element is only present for file format v2.2 and higher.

The nvsize element is only present for file format v2.2 and higher. (TBT)

file

The name of the file.

The name of the file. (TBT)

$info = Storable::read_magic( $buffer )
$info = Storable::read_magic( $buffer, $must_be_file )

The $buffer should be a Storable image or the first few bytes of it. If $buffer starts with a Storable header, then a hash describing the image is returned, otherwise undef is returned.

The $buffer should be a Storable image or the first few bytes of it. If $buffer starts with a Storable header, then a hash describing the image is returned, otherwise undef is returned. (TBT)

The hash has the same structure as the one returned by Storable::file_magic(). The file element is true if the image is a file image.

The hash has the same structure as the one returned by Storable::file_magic(). The file element is true if the image is a file image. (TBT)

If the $must_be_file argument is provided and is TRUE, then return undef unless the image looks like it belongs to a file dump.

If the $must_be_file argument is provided and is TRUE, then return undef unless the image looks like it belongs to a file dump. (TBT)

The maximum size of a Storable header is currently 21 bytes. If the provided $buffer is only the first part of a Storable image it should at least be this long to ensure that read_magic() will recognize it as such.

The maximum size of a Storable header is currently 21 bytes. If the provided $buffer is only the first part of a Storable image it should at least be this long to ensure that read_magic() will recognize it as such. (TBT)

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, 'mycolors') or die "Can't store %a in mycolors!\n";

        $colref = retrieve('mycolors');
        die "Unable to retrieve from mycolors!\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;
        # because of opcodes used in "use strict":
        $safe->permit(qw(:default require));
        local $Storable::Deparse = 1;
        local $Storable::Eval = sub { $safe->reval($_[0]) };
        my $serialized = freeze(sub { 42 });
        my $code = thaw($serialized);
        $code->() == 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, FORMLINE, etc.... If you can define semantics for those operations, feel free to enhance Storable so that it can deal with them.

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

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 は現在は整数の大きさについての情報を持ったファイルヘッダを 出力し、読み込むように変更されています。 読み込まれた古いファイルが、32 ビット整数なのか 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 ビット整数で構成設定された perl 5.6.0 や 5.6.1 で実行した Storable 1.x によって書かれたデータを 持っているのであれば、デフォルトではこの Storable はそれを読み込むことを 拒絶し、Byte order is not compatible(バイト順に互換性がありません)という エラーになります。 もしそのようなデータを持っているのであれば、この Storable が古いヘッダを 持っているファイルを読み書きできるよう、$Storable::interwork_56_64bit を 真の値に設定しなければなりません。 あなたのデータやあなたが通信する古い 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 <jhi@iki.fi>
        Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
        Benjamin A. Holzman <bah@ecnvantage.com>
        Andrew Ford <A.Ford@ford-mason.co.uk>
        Gisle Aas <gisle@aas.no>
        Jeff Gresham <gresham_jeffrey@jpmorgan.com>
        Murray Nesbitt <murray@activestate.com>
        Marc Lehmann <pcg@opengroup.org>
        Justin Banks <justinb@wamnet.com>
        Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
        Salvador Ortiz Garcia <sog@msg.com.mx>
        Dominic Dunlop <domo@computer.org>
        Erik Haugan <erik@solbors.no>

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 <Raphael_Manfredi@pobox.com> Maintenance is now done by the perl5-porters <perl5-porters@perl.org>

Storable は Raphael Manfredi <Raphael_Manfredi@pobox.com> によって 作成されました。 現在、perl5-porters <perl5-porters@perl.org> によって保守されています。

Please e-mail us with problems, bug fixes, comments and complaints, although if you have compliments 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 に送られるべき 賛辞であっても、私たちにメールしてください。 どうか障害について Raphael に メールしないでください。 彼はもう Storable について取り組んでいません。 そしてあなたのメッセージは彼が私たちに転送するまで遅れてしまいます。

SEE ALSO

Clone.