Проблема хранения хеша в БД с использованием Storable :: nfreeze в Perl - PullRequest
1 голос
/ 16 апреля 2010

Я хочу вставить хэш в БД, используя Storable :: nfreeze, но данные вставлены неправильно.

Мой код выглядит следующим образом:

%rec=();
$rec{'name'} = 'my name';
$rec{'address'} = 'my address';

my $order1 = new Order();
$order1->set_session(\%rec);
$self->createOrder($order1);

sub createOrder {
my $self  = $_[0];
my $order = $_[1];


# Retrieve the fields to insert into the database.
my $st = $dbh->prepare("insert into order (session,.......) values(?,........)");

my $session   = %{$order->get_session()};
$st->execute(&Storable::nfreeze(\%session),.....);
$st->finish();

}

sub getOrder
{
     ...

    my $session = &Storable::thaw( $ref->{'session'} );
    .....
}    

thaw работает нормально, потому что я проверил его с некоторыми правильно вставленными строками, но когда я пытаюсь получить строку, вставленную с помощью подпрограммы createOrder, я получаю сообщение об ошибке:

Сохраняемое двоичное изображение v36.65, более новое, чем я (v2.7), в строке blib / lib / Storable.pm (автоматическое разбиение на строку blib / lib / auto / Storable / thaw.al) 415

Ошибка исходит от строки, которая имеет thaw. nfreeze неправильно сохранил хэш.

Может кто-нибудь указать мне, что я делаю неправильно в подпрограмме createOrder?

Я знаю, что версия модуля не имеет отношения к проблеме.

1 Ответ

4 голосов
/ 16 апреля 2010

Ваша проблема, вероятно, неправильная разыменование здесь:

my $session   = %{$order->get_session()};
$st->execute(&Storable::nfreeze(\%session),.....);

Это должно это исправить:

my $session   = $order->get_session();
$st->execute(&Storable::nfreeze($session),.....);

Поскольку ->get_session возвращает ссылку на хеш, когда вы разыменовываете ее в скалярном контексте, она превращается в строку, содержащую статистику по хешу. Хеш %session - это пустая переменная пакета %main::session, которую вы бы поймали, если бы работали с use strict; use warnings;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...