簡體   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