入力ファイルから解析ルールをサブとして生成するPerlプログラムがあります。潜水艦は匿名で定義され、ハッシュに入れられます。ここで、すべてのサブを含むそのハッシュをエクスポートし、後で別のプログラムで使用するためにそれらを再度ロードしたいと思います。
どうすればこれを行うことができますか?各サブのコードを抽出する方法はありますか、またはハッシュが存在するメモリのブロックをコピーして、後で再度ロードするときにハッシュとしてキャストできますか?
前もって感謝します。
入力ファイルから解析ルールをサブとして生成するPerlプログラムがあります。潜水艦は匿名で定義され、ハッシュに入れられます。ここで、すべてのサブを含むそのハッシュをエクスポートし、後で別のプログラムで使用するためにそれらを再度ロードしたいと思います。
どうすればこれを行うことができますか?各サブのコードを抽出する方法はありますか、またはハッシュが存在するメモリのブロックをコピーして、後で再度ロードするときにハッシュとしてキャストできますか?
前もって感謝します。
KiokuDBは、他のPerlタイプに加えて、コード参照の格納を処理できます。さまざまなYAMLモジュール、Data :: Dump :: Streamer、さらにはData::Dumperも同様です。
Storableドキュメントの「CodeReferences 」セクションから(強調を追加して):
Storableバージョン2.05以降、CODE参照は。を使用してシリアル化できます
B::Deparse
。この機能を有効にする$Storable::Deparse
には、true値に設定します。デシリアライズを有効にするに$Storable::Eval
は、をtrue値に設定する必要があります。逆シリアル化はを介して行われることに注意してくださいeval
。これは、保存可能なファイルに悪意のあるデータが含まれている場合は危険です。
以下のデモでは、子プロセスが匿名サブのハッシュを作成します。次に、親は、完全に別個のプロセスとアドレススペースにあるため、表示できません。ディスク上のファイルからの場合と同じ方法で、%dispatch
からの出力を読み取ります。freeze
#! /usr/bin/perl
use warnings;
use strict;
use Storable qw/ freeze thaw /;
my $pid = open my $fh, "-|";
die "$0: fork: $!" unless defined $pid;
if ($pid == 0) {
# child process
my %dispatch = (
foo => sub { print "Yo!\n" },
bar => sub { print "Hi!\n" },
baz => sub { print "Holla!\n" },
);
local $Storable::Deparse = 1 || $Storable::Deparse;
binmode STDOUT, ":bytes";
print freeze \%dispatch;
exit 0;
}
else {
# parent process
local $/;
binmode $fh, ":bytes";
my $frozen = <$fh>;
local $Storable::Eval = 1 || $Storable::Eval;
my $d = thaw $frozen;
$d->{$_}() for keys %$d;
}
出力:
やあ! ホラ! よ!