2010-04-16 18 views
1

我想使用Storable :: nfreeze在db中插入散列,但數據插入不正確。使用Stored :: nfreeze在Perl中存儲散列的問題

我的代碼如下:

%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目錄/自動/存儲/解凍。 al)line 415

錯誤來自具有thaw的行。 nfreeze沒有正確存儲散列。

有人能指點我在01​​子程序中做錯了什麼嗎?

我知道模塊版本與問題無關。

+2

@Sam =>你有一些沒有被接受的答案的開放式問題。假設有一個很好的答案,請單擊該答案旁邊的複選標記以將其標記爲已接受。 – 2010-04-16 14:53:59

回答

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;運行,則會發現它。