Как использовать Perl FreezeThaw для размораживания объекта, а затем вызывать методы объекта для него? - PullRequest
1 голос
/ 31 марта 2012

Я использую модуль 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 ]

2 голосов
/ 31 марта 2012

Вы должны назначить список.

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 голос
/ 31 марта 2012

Вам нужно позвонить thaw в контексте списка. Это может быть достигнуто путем изменения

my $olddata = thaw $string;

до

my ($olddata) = thaw $string;

Я только что подал сообщение об ошибке относительно этой сомнительной необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...