7

入力ファイルから解析ルールをサブとして生成するPerlプログラムがあります。潜水艦は匿名で定義され、ハッシュに入れられます。ここで、すべてのサブを含むそのハッシュをエクスポートし、後で別のプログラムで使用するためにそれらを再度ロードしたいと思います。

どうすればこれを行うことができますか?各サブのコードを抽出する方法はありますか、またはハッシュが存在するメモリのブロックをコピーして、後で再度ロードするときにハッシュとしてキャストできますか?

前もって感謝します。

4

2 に答える 2

4

KiokuDBは、他のPerlタイプに加えて、コード参照の格納を処理できます。さまざまなYAMLモジュール、Data :: Dump :: Streamer、さらにはData::Dumperも同様です。

于 2010-02-04T17:17:45.760 に答える
2

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;
}

出力:

やあ!
ホラ!
よ!
于 2010-02-04T21:37:37.083 に答える