2012-07-24 57 views
4

我想序列化哈希散列,然後反序列化它以獲取哈希的原始哈希..問題是每當我反序列化它..它附加一個自動生成的$ var1例如。Perl序列化和反序列化散列哈希

原始散列

%hash=(flintstones => { 
    husband => "fred", 
    pal  => "barney", 
}, 
jetsons => { 
    husband => "george", 
    wife  => "jane", 
    "his boy" => "elroy", 
}, 
); 

出來作爲 $ VAR1 = { '辛普森一家'=> { '孩子'=>'巴特, '妻子'=> '瑪吉', 「丈夫」 => '本壘打' }, '打火石'=> { '丈夫'=>'弗瑞德, '朋友'=> '巴尼' }, };

有沒有什麼辦法可以得到散列的原始散列沒有$ var1 .. ??

+0

'$ VAR1'不被預置。這是序列化的一部分。是什麼讓你認爲在反序列化之後給出了不同的散列?你如何反序列化它? – ikegami 2012-07-24 01:57:23

+1

就我個人而言,我會使用JSON :: XS連載到JSON。 Data :: Dumper是一個調試工具,不是一個好的串行器。特別是沒有默認選項。 – ikegami 2012-07-24 01:58:59

+0

我已使用凍結/解凍序列化/反序列化...我需要獲得原始散列,以便我可以對它進行一些計算... – user1547285 2012-07-24 02:10:43

回答

8

你已經證明了Storable可以很好地工作。 $VAR1是Data :: Dumper序列化的一部分。

use Storable  qw(freeze thaw); 
use Data::Dumper qw(Dumper); 

my %hash1 = (
    flintstones => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    jetsons => { 
     husband => "george", 
     wife  => "jane", 
    "his boy" => "elroy", 
    }, 
); 

my %hash2 = %{thaw(freeze(\%hash1))}; 

print(Dumper(\%hash1)); 
print(Dumper(\%hash2)); 

正如你所看到的,原來的和拷貝是相同的:

$VAR1 = { 
      'jetsons' => { 
         'his boy' => 'elroy', 
         'wife' => 'jane', 
         'husband' => 'george' 
         }, 
      'flintstones' => { 
          'husband' => 'fred', 
          'pal' => 'barney' 
          } 
     }; 
$VAR1 = { 
      'jetsons' => { 
         'his boy' => 'elroy', 
         'wife' => 'jane', 
         'husband' => 'george' 
         }, 
      'flintstones' => { 
          'husband' => 'fred', 
          'pal' => 'barney' 
          } 
     }; 
+0

謝謝...沒有意識到自卸車 – user1547285 2012-07-24 02:21:55

3

如果設置$Data::Dumper::Terse1,然後數據::自卸車將嘗試跳過這些變量名(但結果有時不能再由eval解析)。

use Data::Dumper; 
$Data::Dumper::Terse = 1; 
print Dumper \%hash; 

現在變成:

{ 
    'jetsons' => { 
       'his boy' => 'elroy', 
       'wife' => 'jane', 
       'husband' => 'george' 
       }, 
    'flintstones' => { 
        'husband' => 'fred', 
        'pal' => 'barney' 
        } 
} 

也許像JSONYAML將是你的目的更好?