Как я должен сериализировать ссылки в коде в Perl?

StackOverflow https://stackoverflow.com/questions/3845134

Вопрос

я желаю 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}();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top