繁体   English   中英

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

[英]How do I serialize an array of array-references in Perl?

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

我有以下数据需要序列化为字符串,所以我可以把它放在数据库中:

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

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

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

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

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

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

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

下面的程序显示了如何使用标准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反序列化的严重不利因素。 可储存很好,紧凑但不透明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM