Dav*_*d B 6 perl serialization closures store function
我认为使用一个例子可能是最好的问题:
use strict;
use warnings;
use 5.010;
use Storable qw(nstore retrieve);
local $Storable::Deparse = 1;
local $Storable::Eval = 1;
sub sub_generator {
my ($x) = @_;
return sub {
my ($y) = @_;
return $x + $y;
};
}
my $sub = sub_generator(1000);
say $sub->(1); # gives 1001
nstore( $sub, "/tmp/sub.store" );
$sub = retrieve("/tmp/sub.store");
say $sub->(1); # gives 1
Run Code Online (Sandbox Code Playgroud)
当我转储时,/tmp/sub.store我看到:
$VAR1 = sub {
package Storable;
use warnings;
use strict 'refs';
my($y) = @_;
return $x + $y;
}
Run Code Online (Sandbox Code Playgroud)
但是$x从未在此子目录中定义.我希望生成的子sub_generator将$x在生成时替换为其实际值.我该怎么解决这个问题?
注意这个问题涉及到这一个.
不幸的是,我不认为Storable适用于闭包.但是,还有其他CPAN模块将序列化闭包.例如.Data::Dump::Streamer
use 5.012;
use warnings;
use Data::Dump::Streamer;
sub sub_generator {
my ($x) = @_;
return sub {
my ($y) = @_;
return $x + $y;
};
}
my $sub = sub_generator(1000);
say $sub->(1); # gives 1001
my $serialised = Dump( $sub )->Out;
my $copy = do {
my $CODE1 = undef;
eval $serialised;
$CODE1;
};
say $copy->(2); # gives 1002
say $sub->(1); # still gives 1001
Run Code Online (Sandbox Code Playgroud)
这是在此处打印时序列化代码的样子say Dump $sub;:
my ($x);
$x = 1000;
$CODE1 = sub {
use warnings;
use strict 'refs';
BEGIN {
$^H{'feature_unicode'} = q(1);
$^H{'feature_say'} = q(1);
$^H{'feature_state'} = q(1);
$^H{'feature_switch'} = q(1);
}
my($y) = @_;
return $x + $y;
};
Run Code Online (Sandbox Code Playgroud)
更新
在Perl5搬运工邮件列表中查看此线程Storable和Closures.它证实了我的想法Storable和封闭.
/ I3az /
| 归档时间: |
|
| 查看次数: |
432 次 |
| 最近记录: |