Как я должен сериализировать ссылки в коде в Perl?
-
27-09-2019 - |
Вопрос
я желаю nstore
Hash Perl, который также содержит ссылку на код. Следуя этому перегородка Я написал что-то вроде этого:
use strict;
use warnings;
local $Storable::Deparse = 1;
my %hash = (... CODE => ...);
nstore (\%hash, $file);
Я получаю предупреждение, говоря Name "Storable::Deparse" used only once: possible typo at test4.pl line 15.
. Отказ Я думаю, что я мог бы специально подавить это предупреждение, но это заставляет меня задуматься, что я делаю что-то не так.
Обратите внимание на этот вопрос относится к этому один. Отказ Различные названия для различения между ними будут наиболее приветствуются.
Решение
Вы пренебрегали загружать хранимый модуль, прежде чем установить одно из его значений конфигурации.
use strict;
use warnings;
use Storable qw(nstore);
local $Storable::Deparse = 1;
my %hash = (... CODE => ...);
nstore (\%hash, $file);
Другие советы
Ссылки кода не могут быть просто сериализованы. Ручки файлов, соединения баз данных и все, что имеет внешние ресурсы, не могут быть просто сериализованы.
При сериализации таких предметов вы должны описать их таким образом, чтобы их можно было воссоздать. Например, вы можете сериализовать дескриптор файлов как путь и смещение или ссылку кода как имя функции, на который указал ссылку на.
Вы можете найти имя подпрограммы код ссылок кода Sub::Identify
:
#!/usr/bin/perl
use strict;
use warnings;
use Sub::Identify qw/sub_fullname/;
sub foo {}
my $r = \&foo;
print sub_fullname($r), "\n";
Конечно, это означает, что вы не можете сериализовать анонимные ссылки, и сериализованные данные могут надежно использовать только программами, которые реализуют именованные функции таким же образом.
Если вы обнаружите, что нужно сделать это, вам, вероятно, лучше с помощью класса вместо простого эталона кода.
Вам также нужно установить
$Storable::Eval = 1;
таким образом:
#! perl
use strict;
use warnings;
use Storable qw /nstore retrieve/;
local $Storable::Deparse = 1;
local $Storable::Eval = 1;
my %hash = ( CODE => sub {print "ahoj\n";});
nstore (\%hash, 'test');
my $retrieved = retrieve ( 'test');
$retrieved->{CODE}();