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

Posted

技术标签:

【中文标题】Perl 使用 Data::Dumper 持久化数据存储【英文标题】:Perl persistent data storage using Data::Dumper 【发布时间】:2010-03-26 04:25:50 【问题描述】:

今晚我一直在努力解决这个问题。我已经用谷歌搜索了它,但没有一个例子或我对这些例子的破解完成它。看起来这应该很容易,但我就是无法理解。代码如下:

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

my $complex_variable = ;
my $MEMORY = "$ENVHOME/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 输出相同,这正是我想要实现的。

我在这里缺少什么?我应该以不同的方式“做”,还是应该“评估”,如果是的话怎么做?

感谢您的帮助...

【问题讨论】:

【参考方案1】:

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

其次,我还没有尝试过,但在我看来,当您“执行 $MEMORY”时,您没有存储 hashref。eval 被注释掉了。试试:

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

【讨论】:

Storable 是这里的最佳选择。我说的是在他的 CPAN 目录中上传了最新的 Data::Dumper 的人。 Data::Dump::Streamer 很好,如果你想保持输出可读性。 我知道。在尝试使用数据转储器之前,我一直在使用可存储,因为它更容易,并且随着我的数据集变得更大,我将切换回可存储。我需要的是向脚本添加新功能的能力,以便能够查看存储的数据并将其恢复。当我更多地开发脚本时,这一切都是为了调试。我也会看看 Data::Dump::Streamer,谢谢!【参考方案2】:

我们都有这样的夜晚!试试:

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

【讨论】:

【参考方案3】:

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

【讨论】:

嗯,我说的东西是针对小数据集的。 :)

以上是关于Perl 使用 Data::Dumper 持久化数据存储的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中打印散列的内容?

如何区分 Perl 中的数字标量和字符串标量?

如何区分 Perl 中的数字标量和字符串标量?

CentOS7配置SCST服务的问题解决

有哪些好的 Perl 调试方法?

如何将数组作为值存储在 Perl 哈希中?