Perl有很多序列化數據的模塊,我不知道選哪一個。如何在Perl中序列化一個數組引用的數組?
我有以下數據,我需要序列化作爲一個字符串,所以我可以把它放在數據庫:
my @categories = (
["Education", "Higher Education", "Colleges"],
["Schooling", "Colleges"]
);
我怎麼可能把它變成文字,再後來,當我需要的時候,轉回到數組引用?
Perl有很多序列化數據的模塊,我不知道選哪一個。如何在Perl中序列化一個數組引用的數組?
我有以下數據,我需要序列化作爲一個字符串,所以我可以把它放在數據庫:
my @categories = (
["Education", "Higher Education", "Colleges"],
["Schooling", "Colleges"]
);
我怎麼可能把它變成文字,再後來,當我需要的時候,轉回到數組引用?
您可以使用Data::Serializer
:
你可以滾你自己的,但你不必擔心棘手的問題,比如逃逸引號和反斜槓或您選擇的分隔符。
下面的程序顯示瞭如何使用標準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: [email protected]";
is_deeply $restored, \@categories;
}
{
my $serialized = unpack "H*", nfreeze \@categories;
print $serialized, "\n";
my $restored = thaw pack "H*", $serialized;
die "deserialization failed: [email protected]" unless defined $restored;
is_deeply $restored, \@categories;
}
數據::自卸車有被人類可讀很好的特性,但要求eval
反序列化的嚴重的負面。可儲存是很好,緊湊但不透明。
我投JSON(或Data::Serializer
正如在另一個答案中提到的,連同JSON
)。
JSON
模塊快速高效(如果您從cpan安裝JSON :: XS,它會爲您編譯C版本,並且use JSON
將自動使用該模塊)。
它與Perl數據結構很好地工作,是標準化的,並且Javascript語法與Perl語法非常相似。您可以使用JSON
模塊設置選項以提高人員的可讀性(換行符等)。
我也使用了Storable
。我不喜歡它 - 界面很奇怪,輸出是荒謬的,它是一種專有格式。 Data::Dumper
速度快,可讀性強,但實際上只是單向的(eval
它稍微有些黑客),而且它只是Perl。我也推出了自己的產品。最後,我總結出JSON是最好的,是快速,靈活和健壯的。
我想指出,你可能想考慮在JSON中編碼。沒有必要,也可能效率不高,但它具有與語言無關的優勢。 –
重複http://stackoverflow.com/questions/10684656/store-and-read-hash-and-array-in-files-in-perl – daxim