Постоянное хранилище данных Perl с использованием Data::Dumper

Я пытался понять это в течение долгого времени сегодня вечером. Я загуглил это до смерти, и ни один из примеров или моих взломов примеров не делает этого. Кажется, что это должно быть довольно легко, но я просто не могу этого понять. Вот код:

#!/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, чего я и пытаюсь добиться.

Что мне здесь не хватает? Должен ли я «делать» по-другому или вместо этого я должен «оценивать», и если да, то как?

Спасибо за любую помощь...


person stephenmm    schedule 26.03.2010    source источник


Ответы (3)


У всех нас есть такие вечера! Пытаться:

$complex_variable = do $MEMORY || die "Bad data";
person Gavin Brock    schedule 26.03.2010

Во-первых, я бы рекомендовал использовать Storeable.pm вместо Data::Dumper. У хранилища есть методы замораживания и оттаивания, которые могут сохранять структуру данных в ее двоичной форме, не переводя ее в текст и обратно.

Во-вторых, я не пробовал это, но мне не кажется, что вы сохраняете хэш-ссылку, когда «делаете $MEMORY». eval закомментирован. Пытаться:

$complex_variable = eval $MEMORY;
print Dumper($complex_variable)."TEST003\n";
person joatis    schedule 26.03.2010
comment
Хранение - это путь сюда. И я говорю это как человек, у которого самая последняя загрузка Data::Dumper находится в его каталоге CPAN. - person tsee; 26.03.2010
comment
Data::Dump::Streamer хорош, если вы хотите, чтобы вывод был удобочитаемым. - person jrockway; 26.03.2010
comment
Я знаю. Я использовал хранимое до того, как попытался использовать дампер данных, так как это было намного проще, и я вернусь к хранимому, когда мой набор данных станет больше. Что мне было нужно, так это возможность добавлять новые функции в скрипт, чтобы иметь возможность видеть сохраненные данные и восстанавливать их обратно. Это все для отладки, так как я больше разрабатываю скрипт. Я также рассмотрю Data::Dump::Streamer, спасибо! - person stephenmm; 27.03.2010

Мне больше нравится DBM::Deep. Однако в Mastering Perl у меня есть целая глава "Lightweight Persistence", в которой говорится обо всем, кроме сервер базы данных.

person brian d foy    schedule 26.03.2010
comment
Гм, то, о чем я говорю, касается небольших наборов данных. :) - person brian d foy; 27.03.2010