我应该如何在Perl中序列化代码引用?

我应该如何在Perl中序列化代码引用?,perl,serialization,function,store,Perl,Serialization,Function,Store,我希望nstore一个Perl哈希,它还包含一个代码引用。接下来我写了这样的东西: use strict; use warnings; local $Storable::Deparse = 1; my %hash = (... CODE => ...); nstore (\%hash, $file); 我收到一条警告说,Name“Storable::Deparse”只使用了一次:test4.pl第15行可能有输入错误。。我想我可以明确地抑制这个警告,但它让我怀疑我是否做错了什么 请注意

我希望
nstore
一个Perl哈希,它还包含一个代码引用。接下来我写了这样的东西:

use strict;
use warnings;
local $Storable::Deparse = 1; 
my %hash = (... CODE => ...);
nstore (\%hash, $file);
我收到一条警告说,
Name“Storable::Deparse”只使用了一次:test4.pl第15行可能有输入错误。
。我想我可以明确地抑制这个警告,但它让我怀疑我是否做错了什么


请注意,这个问题与此相关。最受欢迎的是用不同的标题来区分两者。

代码引用不能简单地序列化。文件句柄、数据库连接以及任何具有外部资源的内容都不能简单地序列化

序列化这些项时,必须以可以重新创建的方式描述它们。例如,可以将文件句柄序列化为路径和偏移量,或者将代码引用序列化为引用所指向的函数名

您可以找到代码引用指向的子例程的名称:

当然,这意味着您无法序列化匿名引用,并且序列化的数据只能由以相同方式实现命名函数的程序可靠地使用

如果您发现自己需要这样做,那么最好使用类而不是简单的代码引用

您还需要设置

$Storable::Eval = 1;
因此:


在设置可存储模块的一个配置值之前,您忽略了加载该模块

use strict;
use warnings;
use Storable qw(nstore);
local $Storable::Deparse = 1; 
my %hash = (... CODE => ...);
nstore (\%hash, $file);
#! perl

use strict;
use warnings;

use Storable qw /nstore retrieve/;


local $Storable::Deparse = 1; 
local $Storable::Eval = 1; 

my %hash = ( CODE => sub {print "ahoj\n";});


nstore (\%hash, 'test');
my $retrieved = retrieve ( 'test');

$retrieved->{CODE}();
use strict;
use warnings;
use Storable qw(nstore);
local $Storable::Deparse = 1; 
my %hash = (... CODE => ...);
nstore (\%hash, $file);