2

我想将哈希保存为数据库中的打包字符串,我可以将打包部分保存下来,但是我在获取哈希时遇到了问题

测试哈希

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可以原样存储到BLOB字段中,而生成的字符串Cpanel::JSON::XS->new->encode可以原样存储到TEXT字段中。

于 2012-02-17T21:25:31.600 回答
4

您可能想 Storable试一试该模块。

它可以 :

  • 将您的哈希(参考)存储为字符串freeze
  • thaw在检索时它出来
于 2012-02-17T20:33:11.947 回答
3

有很多不同的方法可以将数据结构存储在标量中,然后将其“恢复”回其原始状态。每个都有优点和缺点。

由于您从 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);

正如已经建议的那样,可存储也是一个好主意。但它可能相当古怪。如果您只希望自己的脚本/系统来存储和恢复数据,那就太好了,但除此之外,它可能会让人头疼。即使在不同的操作系统之间传输数据也会导致问题。建议您使用 freeze,对于大多数本地应用程序,这是正确的选择。如果您决定使用 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 回答