【问题标题】:Problem storing a hash in DB using Storable::nfreeze in Perl在 Perl 中使用 Storable::nfreeze 在 DB 中存储哈希时出现问题
【发布时间】:2010-04-16 13:57:23
【问题描述】:

我想使用 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 子例程中做错了什么吗?

我知道模块版本与问题无关。

【问题讨论】:

  • @Sam => 您有许多未解决的问题,但没有得到接受的答案。假设有一个好的答案,请单击该答案旁边的复选标记以将其标记为已接受。

标签: perl hash storable freeze-thaw


【解决方案1】:

您的问题可能是此处不正确的取消引用:

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; 运行,您会捕获它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2012-12-11
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多