我想使用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(autosplit进入blib / lib / auto / Storable / thaw.al)第415行
错误来自thaw
行。 nfreeze
没有正确存储哈希值。
有人能指出我在createOrder
子程序中做错了吗?
我知道模块版本与问题无关。
答案 0 :(得分:4)
你的问题可能是在这里不正确的解除引用:
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;
运行,则会捕获它。