Domanda

desidero nstore un hash Perl che contiene anche un riferimento a codice. A seguito di questa perldoc ho scritto qualcosa di simile:

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

ho un Name "Storable::Deparse" used only once: possible typo at test4.pl line 15. dicendo avvertimento. Credo che in particolare ho potuto sopprimere questo avviso, ma mi domando se sto facendo qualcosa di sbagliato.

Si noti questa domanda si riferisce a questo uno . Titoli diversi per distinguere tra i due saranno più accolti.

È stato utile?

Soluzione

si sia dimenticato di caricare il modulo riponibile, prima di uno dei suoi valori di configurazione.

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

Altri suggerimenti

riferimenti a codice non può essere serializzato semplicemente. handle di file, connessioni al database, e tutto ciò che ha risorse esterne non possono essere semplicemente serializzati.

Quando la serializzazione di tali elementi, è necessario descrivere in tal modo un che possano essere ricreati. Ad esempio, si potrebbe serializzare un handle di file come un percorso e un offset o un codice di riferimento come il nome della funzione di riferimento stava indicando.

È possibile trovare il nome della subroutine un punti di riferimento per il codice con 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";

Naturalmente, questo significa che è possibile riferimenti non serializzare anonimi ei dati serializzati possono affidabile solo essere utilizzati da programmi che implementano le funzioni denominate allo stesso modo.

Se vi trovate a dover fare questo, si sono probabilmente meglio utilizzare una classe, invece di un semplice riferimento a codice.

È inoltre necessario impostare

$Storable::Eval = 1;

così:

#! 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}();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top