2010-03-26 68 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