如何使用Perl的FreezeThaw来解冻一个对象,然后在其上调用对象方法?

时间:2012-03-30 20:13:03

标签: perl

我正在使用Perl的Calendar模块来创建“日期”,我希望将此数据序列化为文本文件,然后将其恢复。

我正在尝试使用FreezeThaw来完成此任务。因此,这就是我到目前为止所做的:

my $date = Calendar->new_from_Gregorian((localtime)[4] + 1, (localtime)[3], (localtime)[5]+1900);
$string = freeze $date;
print $string."\n";
$olddata = thaw $string;
print $olddata->date_string."\n";

我回来了:

FrT;@1|>>0|$19|Calendar::Gregorian%8|$8|absolute$3|day$5|month$4|year$6|734599$1|6$1|4$4|2012
Can't call method "date_string" on an undefined value at calendar.pl line 23.

我的问题是:如何将解冻后的值恢复为可用的Calendar对象,以便我可以调用$olddata->date_string?等方法

2 个答案:

答案 0 :(得分:2)

您必须分配到列表。

my $date = Calendar->new_from_Gregorian((localtime)[4] + 1, (localtime)[3], (localtime)[5]+1900);
my $string = freeze $date;
say $string;
my( $olddata ) = thaw $string;
say $olddata->date_string;

期待多个对象冻结:

use Business::ISBN;
use Calendar;
use Data::Dumper;
use FreezeThaw qw(freeze thaw);

my $isbn = Business::ISBN->new( '0596004923' );
my $date = Calendar->new_from_Gregorian((localtime)[4] + 1, (localtime)[3], (localtime)[5]+1900);

my $string = freeze( $date, $isbn );
say $string;

my( $olddata, $oldisbn ) = thaw $string;
say $olddata->date_string;
say $oldisbn->as_string;

return中的thaw语句以:

结尾
return @$ref;

在标量上下文中,它被计算为数组中元素的数量,所以当你期望一个对象时,你得到1。你不应该知道这一点,FreezeThaw应警告你,你已经错误地调用了它。这是两者之间的区别:

my $value = return_array();
say "Return array: $value";  # 3

$value = return_list();
say "Return list: $value"; # Roscoe

sub return_array {
    my $array = [ qw(Buster Mimi Roscoe) ];
    return @$array;
    }

sub return_list {
    return qw(Buster Mimi Roscoe) ;
    }

答案 1 :(得分:1)

您需要在列表上下文中调用thaw。这可以通过改变

来实现
my $olddata = thaw $string;

my ($olddata) = thaw $string;

我刚刚提出了一个关于这个可疑需求的错误report