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

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

#!/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 输出相同,这正是我想要实现的。

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

感谢您的帮助...

【问题讨论】:

    标签: perl persistent data-storage data-dumper


    【解决方案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 中有一个完整的“轻量级持久性”一章,它讨论了数据库服务器之外的所有内容。

      【讨论】:

      • 嗯,我说的东西是针对小数据集的。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多