2012-06-18 25 views
4

Perl有很多序列化數據的模塊,我不知道選哪一個。如何在Perl中序列化一個數組引用的數組?

我有以下數據,我需要序列化作爲一個字符串,所以我可以把它放在數據庫:

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

我怎麼可能把它變成文字,再後來,當我需要的時候,轉回到數組引用?

+0

我想指出,你可能想考慮在JSON中編碼。沒有必要,也可能效率不高,但它具有與語言無關的優勢。 –

+0

重複http://stackoverflow.com/questions/10684656/store-and-read-hash-and-array-in-files-in-perl – daxim

回答

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: [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反序列化的嚴重的負面。可儲存是很好,緊湊但不透明。

4

我投JSON(或Data::Serializer正如在另一個答案中提到的,連同JSON)。

JSON模塊快速高效(如果您從cpan安裝JSON :: XS,它會爲您編譯C版本,並且use JSON將自動使用該模塊)。

它與Perl數據結構很好地工作,是標準化的,並且Javascript語法與Perl語法非常相似。您可以使用JSON模塊設置選項以提高人員的可讀性(換行符等)。

我也使用了Storable。我不喜歡它 - 界面很奇怪,輸出是荒謬的,它是一種專有格式。 Data::Dumper速度快,可讀性強,但實際上只是單向的(eval它稍微有些黑客),而且它只是Perl。我也推出了自己的產品。最後,我總結出JSON是最好的,是快速,靈活和健壯的。