Perl序列化和反序列化哈希表的哈希表

6
我正在尝试对哈希表进行序列化,然后再反序列化以获取原始的哈希表。但问题在于,每当我进行反序列化时,它都会附加一个自动生成的 $var1 。
原始的哈希表如下:
%hash=(flintstones => {
    husband   => "fred",
    pal       => "barney",
},
jetsons => {
    husband   => "george",
    wife      => "jane",
    "his boy" => "elroy",  
},
);

转换后的结果为:

输出如下: $VAR1 = { 'simpsons' => { 'kid' => 'bart', 'wife' => 'marge', 'husband' => 'homer' }, 'flintstones' => { 'husband' => 'fred', 'pal' => 'barney' }, };

有没有办法在不使用$var1的情况下获取原始哈希值?


$VAR1不是前缀,它是序列化的一部分。您为什么认为在反序列化后会产生不同的哈希值?您如何进行反序列化? - ikegami
1
就我个人而言,我会使用JSON::XS将数据序列化为JSON格式。Data::Dumper是一个调试工具,不是一个好的序列化器,特别是默认选项下更是如此。 - ikegami
我已经使用Freeze/thaw进行了序列化/反序列化...我需要获取原始哈希值,以便对其进行一些计算... - user1547285
1
你提供的输出是由Data::Dumper创建的序列化结果。$VAR1是Data::Dumper序列化结果的一部分。你刚刚展示了Storable的正确工作。 - ikegami
2个回答

10
你已经证明了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'
                           }
        };

3
如果你将$Data::Dumper::Terse设置为1,那么Data::Dumper将尝试跳过这些变量名(但结果有时可能无法被eval解析)。
use Data::Dumper;
$Data::Dumper::Terse = 1;
print Dumper \%hash;

现在变成:

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

也许像 JSON 或者 YAML 这样的格式更适合你的需求?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接