Pergunta

eu desejo nstore um hash Perl que também contém uma referência de código.Seguindo isto perldoc Eu escrevi algo assim:

use strict;
use warnings;
local $Storable::Deparse = 1; 
my %hash = (... CODE => ...);
nstore (\%hash, $file);

Recebo um aviso dizendo Name "Storable::Deparse" used only once: possible typo at test4.pl line 15..Acho que poderia suprimir especificamente esse aviso, mas me faz pensar se estou fazendo algo errado.

Observe que esta questão está relacionada a isso um.Títulos diferentes para distinguir entre os dois serão muito bem-vindos.

Foi útil?

Solução

Você deixou de carregar o módulo armazenável, antes de definir um de seus valores de configuração.

use strict;
use warnings;
use Storable qw(nstore);
local $Storable::Deparse = 1; 
my %hash = (... CODE => ...);
nstore (\%hash, $file);

Outras dicas

As referências de código não podem ser simplesmente serializadas.Identificadores de arquivos, conexões de banco de dados e qualquer coisa que possua recursos externos não podem ser simplesmente serializados.

Ao serializar esses itens, você deve descrevê-los de forma que possam ser recriados.Por exemplo, você pode serializar um identificador de arquivo como um caminho e um deslocamento ou uma referência de código como o nome da função para a qual a referência estava apontando.

Você pode encontrar o nome da sub-rotina para a qual uma referência de código aponta com 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";

Claro, isso significa que você não pode serializar referências anônimas e os dados serializados só podem ser usados ​​de forma confiável por programas que implementam as funções nomeadas da mesma maneira.

Se você precisar fazer isso, provavelmente será melhor usar uma classe em vez de uma simples referência de código.

Você também precisa definir

$Storable::Eval = 1;

portanto:

#! 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}();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top