Проблемы с размораживанием структур данных, хранящихся в Storable::nfreeze?

У меня есть куча данных, хранящихся в одном столбце в таблице MySQL. У меня есть доступ к ~5-летнему Perl-коду, который хранил его там, и вижу, что это все хэши, которые были заморожены с Storable::nfreeze перед хранением. MySQL столбец TEXT и таблица на latin1 кодирование. Я сейчас пытаюсь получить эти данные обратно для одноразового экспорта. Я знаю, что приложение изначально работало на Perl 5.8.x, поэтому я пытаюсь сделать это с Perl-5.8.8. К сожалению, я не знаю, какая версия Storable использовалась.

Сначала я попытался использовать самый последний Storable, 2,39. Это дает мне:

Storable binary image v32.32 more recent than I am (v2.9) at
perlbrew/perls/perl-5.8.8/lib/5.8.8/darwin-2level/Storable.pm line 417`

С Storable-2.14 я получаю

Storable binary image v32.32 more recent than I am (v2.7) at blib/lib/Storable.pm
(autosplit into blib/lib/auto/Storable/thaw.al) line 363

С Storable-2.13 я получаю

Storable binary image v2.7 more recent than I am (v2.6) at blib/lib/Storable.pm  
(autosplit into blib/lib/auto/Storable/thaw.al) line 363

Неоправданно высокие числа двоичных изображений в>= 2.14 заставляют меня думать, что есть некоторые изменения в том, как анализируются числа. Я полагаю, что этот код, вероятно, работал на 32-битной ОС, и теперь я пытаюсь это на 64-битной машине, это может быть релевантным? Далее я попытаюсь запустить diff между 2.13 и 2.14, чтобы посмотреть, смогу ли я выяснить, что является причиной изменения.

Любое руководство может дать кто-нибудь?

Спасибо!

2 ответа

Формат 2.7 был впервые использован с Storable 2.14.

Размер целых чисел вашего Perl (не размер целых чисел вашей машины) действительно может привести к невозможности анализа данных.

У меня была похожая проблема, но оказалось, что мне нужно было декодировать значение, прежде чем я смог разморозить его. Так,

use Storable qw( thaw );
use MIME::Base64 qw( decode_base64 );
my $data = thaw( decode_base64( $frozen_thing ) );

В моем случае данные были сохранены с использованием Apache::Session::Serialize::Base64. Я предполагал, что это было сохранено, используя Apache::Session::Serialize::Storable, следовательно проблема. В этом случае сообщение об ошибке - красная сельдь, но, по крайней мере, вы знаете, что что- то не так.

Другие вопросы по тегам