2

nstoreコード参照も含む Perl ハッシュが必要です。このperldocに続いて、私は次のようなものを書きました:

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.。この警告を具体的に抑制できると思いますが、何か間違ったことをしているのではないかと思います。

この質問はこれに関連していることに注意してください。この 2 つを区別するための異なるタイトルは大歓迎です。

4

3 に答える 3

1

構成値の 1 つを設定する前に、Storable モジュールのロードを怠りました。

use strict;
use warnings;
use Storable qw(nstore);
local $Storable::Deparse = 1; 
my %hash = (... CODE => ...);
nstore (\%hash, $file);
于 2010-10-02T17:06:38.603 に答える
1

コード参照を単純にシリアル化することはできません。ファイル ハンドル、データベース接続、および外部リソースを持つものはすべて、単純にシリアル化することはできません。

そのようなアイテムをシリアライズする場合、再作成できるように記述しなければなりません。たとえば、ファイル ハンドルをパスとしてシリアル化し、オフセットまたはコード参照を参照が指している関数の名前としてシリアル化する場合があります。

コード参照が指すサブルーチンの名前は、次のように見つけることができます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";

もちろん、これは匿名参照をシリアライズできないことを意味し、シリアライズされたデータは、名前付き関数を同じ方法で実装するプログラムによってのみ確実に使用できます。

これを行う必要がある場合は、単純なコード参照の代わりにクラスを使用する方がよいでしょう。

于 2010-10-02T11:48:25.563 に答える
0

また、設定する必要があります

$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}();
于 2010-10-02T12:24:05.507 に答える