使用Data :: Dumper进行Perl持久数据存储

时间:2010-03-26 04:25:50

标签: perl persistent data-storage data-dumper

我一直在努力解决这个问题。我已经用Google搜索了它,并没有任何示例或我的黑客实例完成它。看起来这应该很简单,但我无法得到它。这是代码:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

my $complex_variable = {};
my $MEMORY = "$ENV{HOME}/data/memory-file";

$complex_variable->{ 'key' } = 'value';
$complex_variable->{ 'key1' } = 'value1';
$complex_variable->{ 'key2' } = 'value2';
$complex_variable->{ 'key3' } = 'value3';

print Dumper($complex_variable)."TEST001\n";

open M, ">$MEMORY" or die;
print M Data::Dumper->Dump([$complex_variable], ['$complex_variable']);
close M;

$complex_variable = {};
print Dumper($complex_variable)."TEST002\n";

# Then later to restore the value, it's simply:
do $MEMORY;
#eval $MEMORY;

print Dumper($complex_variable)."TEST003\n";   

这是我的输出:

$VAR1 = {
         'key2' => 'value2',
         'key1' => 'value1',
         'key3' => 'value3',
         'key' => 'value'
       };
TEST001
$VAR1 = {};
TEST002
$VAR1 = {};
TEST003    

我读到的所有东西都说TEST003输出应该与TEST001输出完全相同,这正是我想要实现的。

我在这里缺少什么?我应该“做”不同的做法,还是应该“反对”,如果是这样的话?

感谢您的帮助......

3 个答案:

答案 0 :(得分:6)

首先,我建议使用Storable.pm而不是Data :: Dumper。可存储已冻结&解冻方法可以保留数据结构的二进制形式,而无需将其转换为&从文字回来。

其次,我没有试过这个,但是当你“执行$ MEMORY”时,我觉得你没有存储hashref.eval被注释掉了。尝试:

$complex_variable = eval $MEMORY;
print Dumper($complex_variable)."TEST003\n";

答案 1 :(得分:5)

我们都有那些晚上!尝试:

$complex_variable = do $MEMORY || die "Bad data";

答案 2 :(得分:1)

我倾向于喜欢DBM::Deep。但是,我在Mastering Perl中有一个关于“轻量级持久性”的完整章节,讨论了数据库服务器之外的所有内容。