2010-03-26 64 views
3

我一直在试图找出今晚的方式。我已将它搜索到死亡,并且没有任何示例或我的黑客实例正在完成。看来这应该很容易,但我无法得到它。下面是代码:使用Data :: Dumper的Perl持久数据存储

#!/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"; 

,这里是我的输出:我读说,TEST003输出应该等同于TEST001输出,这正是我想达到

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

一切。

我在这里错过了什么?我应该以不同的方式“做”,还是应该“评估”?如果是,如何?

感谢您的任何帮助...

回答

5

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

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

谢谢,这就是它! – stephenmm 2010-03-26 04:38:14

6

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

其次,我还没有试过这个,但是当你“做$ MEMORY”的时候,你并没有在我看来存储hashref eval被注释掉了。尝试:

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

+1可用于提及。 – tJener 2010-03-26 05:38:15

+1

可爱的是去这里的路。我说这是在他的CPAN目录中有最新的Data :: Dumper上传的人。 – tsee 2010-03-26 07:37:29

+1

Data :: Dump :: Streamer是很好的,如果你想保持输出可读。 – jrockway 2010-03-26 09:04:38

1

我倾向于喜欢DBM::Deep为此。但是,我在Mastering Perl中有关于“轻量级持久性”的完整章节,其中讨论了数据库服务器的所有功能。

+0

谢谢,如果我的数据集开始越来越大,我会调查...... – stephenmm 2010-03-26 21:51:08

+0

恩,我谈论的东西是针对小数据集。 :) – 2010-03-26 22:06:31