如何在Perl中序列化数组引用数组?

时间:2012-06-18 23:51:55

标签: arrays perl serialization multidimensional-array

有很多模块可以为Perl序列化数据,我不知道选择哪一个。

我需要将以下数据序列化为字符串,以便将其放入数据库中:

my @categories = (
    ["Education", "Higher Education", "Colleges"],
    ["Schooling", "Colleges"]
);

我怎么能把它变成文本,然后当我需要它时,转回一个数组引用数组?

3 个答案:

答案 0 :(得分:4)

我投票支持JSON(或另一个答案中提到的Data::Serializer,与JSON一起投票。)

JSON模块快速高效(如果从cpan安装JSON :: XS,它将为您编译C版本,use JSON将自动使用它)。

它适用于Perl数据结构,标准化,并且Javascript语法与Perl语法非常相似。您可以使用JSON模块设置选项以提高人类可读性(换行等)

我也使用了Storable。我不喜欢它 - 界面很奇怪,输出是荒谬的,它是一种专有格式。 Data::Dumper速度快且可读性很强,但实际上是单向的(eval它有点hackish),而且,它只是Perl。我也推出了自己的产品。最后,我总结说JSON是最好的,快速,灵活且强大。

答案 1 :(得分:2)

答案 2 :(得分:1)

你可以自己动手,但你必须担心棘手的问题,例如转义引号和反斜杠或你选择的分隔符。

下面的程序显示了如何使用标准的Perl模块Data :: Dumper和Storable以适合存储在数据库中的方式序列化和反序列化数据。

#! /usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use Storable qw/ nfreeze thaw /;

use Test::More tests => 2;

my @categories = (
    ["Education", "Higher Education", "Colleges"],
    ["Schooling", "Colleges"]
);

{
  local $Data::Dumper::Indent = 0;
  local $Data::Dumper::Terse = 1;
  my $serialized = Dumper \@categories;
  print $serialized, "\n";
  my $restored = eval($serialized) || die "deserialization failed: $@";
  is_deeply $restored, \@categories;
}

{
  my $serialized = unpack "H*", nfreeze \@categories;
  print $serialized, "\n";
  my $restored = thaw pack "H*", $serialized;
  die "deserialization failed: $@" unless defined $restored;
  is_deeply $restored, \@categories;
}

Data :: Dumper具有人类可读的优良特性,但需要eval反序列化的严重不利之处。可存储很好,紧凑但不透明。