将Perl中的匿名子写入文件以供以后使用

时间:2010-02-04 17:08:16

标签: perl hash functional-programming generative-programming

我有一个Perl程序,它从输入文件生成解析规则作为subs。 sub是匿名定义的一个放入哈希。现在,我想导出该哈希值,包含所有子设备,然后再次加载它们以便与其他程序一起使用。

我该怎么做呢?有没有办法提取每个子代码,或者我可以复制散列存在的内存块,然后在以后再次加载时将其转换为哈希值?

提前致谢。

2 个答案:

答案 0 :(得分:4)

除了其他Perl类型之外,

KiokuDB还可以处理存储代码引用。各种YAML模块,Data::Dump::Streamer,甚至Data :: Dumper。

也可以

答案 1 :(得分:2)

从可存储文档的"Code References"部分(更加强调):

  

自可存储版本2.05起,可以在B::Deparse的帮助下序列化CODE引用。要启用此功能,请将$Storable::Deparse设置为true值。要启用反序列化,$Storable::Eval应设置为true值。 请注意,反序列化是通过eval完成的,如果可存储文件包含恶意数据,则会很危险。

在下面的演示中,子进程创建匿名subs的哈希值。然后,父 - 在一个完全独立的进程和地址空间中,因此它看不到%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;
}

输出:

Hi!
Holla!
Yo!