在Perl中如何保存包含子例程引用的哈希?

rjz*_*zii 2 perl serialization hashmap

正如标题所说,在Perl中,如何保存包含子例程引用列表的哈希?例如,我有以下哈希,其中包含对其他库中包含的子例程的引用:

my %testMap = (
  helloTest        => \&runHello,
  goodbyeTest      => \&runGoodbye,
);
Run Code Online (Sandbox Code Playgroud)

当我尝试在以下问题中使用Data :: Dumper时:

my($out) = new FileHandle ">$fileName"; 
my $serialized => Data::Dumper->Dump([\%testMap], [$HASH_REFERENCE]); 
print $out $serialized; 
close $out;
Run Code Online (Sandbox Code Playgroud)

我最终得到一个如下所示的文件:

$testMap = {
             'goodbyeTest' => sub { "DUMMY" },
             'helloTest' => sub { "DUMMY" }
           };
Run Code Online (Sandbox Code Playgroud)

当我希望输出看起来像原始列表中显示的内容时,有没有办法做到这一点?

到目前为止,Data :: Dumper和Storable的一些实验一无所获,我怀疑它是由于引用的实际代码不可用于正在运行的代码.

Zai*_*aid 5

Storable 从版本2.05开始,已能够序列化coderef.

use strict;
use warnings;
use Storable;
use Data::Dump 'dump';

{
    no warnings;             # Suppress 'used only once' warning
    $Storable::Deparse = 1;  # Needs to be set to true as per docs
    $Storable::Eval    = 1;       # Same as above
}

sub hello_world { print "Hello world!\n" }

my %hash = (
             helloTest => \&hello_world,
             byeTest   => sub { print "Goodbye!\n" },
           );

store \%hash, 'file';            # Could use freeze/thaw for
my $cloned = retrieve( 'file' ); # in-memory serialization

$cloned->{helloTest}();          # Prints 'Hello world!'
Run Code Online (Sandbox Code Playgroud)