我有一个Perl程序,它从输入文件生成解析规则作为subs。 sub是匿名定义的一个放入哈希。现在,我想导出该哈希值,包含所有子设备,然后再次加载它们以便与其他程序一起使用。
我该怎么做呢?有没有办法提取每个子代码,或者我可以复制散列存在的内存块,然后在以后再次加载时将其转换为哈希值?
提前致谢。
答案 0 :(得分:4)
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!