Perl-сериализация и десериализация хэшей хэшей

Я пытаюсь сериализовать хэш хэшей, а затем десериализовать его, чтобы вернуть исходный хеш хэшей. Проблема в том, что всякий раз, когда я его десериализую, он добавляет автоматически сгенерированный $ var1, например.

оригинальный хеш

%hash=(flintstones => {
    husband   => "fred",
    pal       => "barney",
},
jetsons => {
    husband   => "george",
    wife      => "jane",
    "his boy" => "elroy",  
},
);

получается как $VAR1 = { 'симпсоны' => { 'ребенок' => 'барт', 'жена' => 'мардж', 'муж' => 'гомер' }, 'флинтстоуны' => { 'муж' => 'фред', 'приятель' => 'барни' }, };

есть ли способ получить исходный хэш хэшей без $var1..??


person user1547285    schedule 24.07.2012    source источник
comment
$VAR1 не добавляется. Это часть сериализации. Что заставляет вас думать, что после десериализации вы получите другой хэш? Как вы его десериализуете?   -  person ikegami    schedule 24.07.2012
comment
Лично я бы сериализовал в JSON, используя JSON:: XS. Data::Dumper — это инструмент отладки, а не хороший сериализатор. Особенно не с параметрами по умолчанию.   -  person ikegami    schedule 24.07.2012
comment
я сериализовал/десериализовал с помощью Freeze/thaw... Мне нужно получить исходный хеш, чтобы я мог выполнить некоторые вычисления с ним...   -  person user1547285    schedule 24.07.2012
comment
Предоставленный вами вывод — это сериализация, созданная Data::Dumper. $VAR1 является частью сериализации Data::Dumper. Вы только что показали, что Storeable работает правильно.   -  person ikegami    schedule 24.07.2012


Ответы (2)


Вы доказали, что Storeable работает отлично. $VAR1 является частью сериализации Data::Dumper.

use Storable     qw( freeze thaw );
use Data::Dumper qw( Dumper );

my %hash1 = (
   flintstones => {
      husband  => "fred",
      pal      => "barney",
   },
   jetsons => {
      husband  => "george",
      wife     => "jane",
     "his boy" => "elroy",  
   },
);

my %hash2 = %{thaw(freeze(\%hash1))};

print(Dumper(\%hash1));
print(Dumper(\%hash2));

Как видите, и оригинал, и копия идентичны:

$VAR1 = {
          'jetsons' => {
                         'his boy' => 'elroy',
                         'wife' => 'jane',
                         'husband' => 'george'
                       },
          'flintstones' => {
                             'husband' => 'fred',
                             'pal' => 'barney'
                           }
        };
$VAR1 = {
          'jetsons' => {
                         'his boy' => 'elroy',
                         'wife' => 'jane',
                         'husband' => 'george'
                       },
          'flintstones' => {
                             'husband' => 'fred',
                             'pal' => 'barney'
                           }
        };
person ikegami    schedule 24.07.2012
comment
Спасибо... не понял про дампер - person user1547285; 24.07.2012

Если вы установите $Data::Dumper::Terse в 1, то Data::Dumper попытается пропустить эти имена переменных (но иногда результат может быть не поддающимся анализу с помощью eval).

use Data::Dumper;
$Data::Dumper::Terse = 1;
print Dumper \%hash;

теперь становится:

{
  'jetsons' => {
                 'his boy' => 'elroy',
                 'wife' => 'jane',
                 'husband' => 'george'
               },
  'flintstones' => {
                     'husband' => 'fred',
                     'pal' => 'barney'
                   }
}

Может быть что-то вроде JSON или YAML подойдет для вашей цели?

person Sebastian Stumpf    schedule 24.07.2012