我正在使用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?
等方法
答案 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。