2

ハッシュをパック文字列として db に保存したいのですが、パック部分は正常に取得できますが、ハッシュを戻すのに問題があります

テストハッシュ

my $hash = {

   test_string   => 'apples,bananas,oranges',
   test_subhash  => { like => 'apples' },
   test_subarray => [ red, yellow, orange ]

}

この例のように JSON:XS を使用してハッシュを json 文字列に変換し、JSON 文字列をパックできるのではないかと考えました...

このアプローチについての考えは?

4

4 に答える 4

5

Storableは、Perl 構造を非常に正確に格納できます。何かが弱参照であることなどを覚えておく必要がある場合は、Storable が必要です。そうでなければ、私はそれを避けます。

JSON ( Cpanel::JSON::XS ) と YAML は良い選択です。

  • あるバージョンの Storable を使用して何かを保存し、以前のバージョンを使用してそれを取得しようとすると、問題が発生する可能性があります。つまり、データベースにアクセスするすべてのマシンが同じバージョンの Storable を持っている必要があります。
  • Cpanel::JSON::XS は Storable よりも高速です。
  • 高速な YAML モジュールは、おそらく Storable よりも高速です。
  • JSON はオブジェクトを格納できませんが、YAML と Storable は格納できます。
  • JSON と YAML は人間が読むことができます (一部の人間にとってはそうです)。
  • JSON と YAML は、他の言語で簡単に解析および生成できます。

使用法:

my $for_the_db = encode_json($hash);
my $hash = decode_json($from_the_db);

「梱包」の意味がわかりません。Cpanel::JSON::XS によって生成された文字列はそのままフィールドにencode_json格納できますが、Cpanel::JSON::XS によって生成された文字列はそのままフィールドに格納できます。BLOBCpanel::JSON::XS->new->encodeTEXT

于 2012-02-17T21:25:31.600 に答える
4

Storableモジュールを回転させたいと思うかもしれません 。

できる :

  • ハッシュ(ref)を文字列として保存しますfreeze
  • thaw取得時にアウト
于 2012-02-17T20:33:11.947 に答える
3

データ構造をスカラーに格納し、それを元の状態に「復元」するには、さまざまな方法があります。それぞれに長所と短所があります。

あなたは JSON から始めたので、JSON を使用した例を示します。

use JSON;
my $hash = {

   test_string   => 'apples,bananas,oranges',
   test_subhash  => { like => 'apples' },
   test_subarray => [ red, yellow, orange ]

}

my $stored = encode_json($hash);

my $restored = decode_json($stored);

すでに提案されているように、保存可能も良い考えです。しかし、それはかなり奇妙かもしれません。独自のスクリプト/システムでデータを保存および復元したいだけなら素晴らしいことですが、それ以上のことは面倒です。異なるオペレーティング システム間でデータを転送する場合でも、問題が発生する可能性があります。フリーズを使用することをお勧めします。ほとんどのローカル アプリケーションでは、それが正しい呼び出しです。複数のマシン間でデータを送信するために Storable を使用する場合は、代わりに nfreeze の使用を検討してください。

そうは言っても、「保存」データ構造を処理できるエンコード方法はたくさんあります。YAML または XML を見てください。

于 2012-02-17T21:26:13.520 に答える
1

「ハッシュをJSON文字列に変換してから、JSON文字列をパックする」という意味がよくわかりません。さらにどのような「パッキング」が必要ですか? それとも「収納」ですか?

ハッシュをデータベースに格納するための代替方法がいくつかあります。

Zaid が示唆したように、Storable tofreezethawハッシュを使用できます。これはおそらく最速の方法です (ただし、速度が重要な場合は、使用しているデータでベンチマークする必要があります)。しかし、Storable は人間が判読できないバイナリ形式を使用します。つまり、Perl を使用してのみこのフィールドにアクセスできます。

あなたが提案したように、ハッシュを JSON 文字列として保存できます。JSON にはかなり人間が読めるという利点があり、ほとんどすべての言語用の JSON ライブラリが存在するため、Perl 以外からデータベース フィールドに簡単にアクセスできます。

CouchDBMongoDBのようなドキュメント指向のデータベースに切り替えることもできますが、それははるかに大きなステップです。

于 2012-02-17T21:33:15.827 に答える