如何在 Perl 中序列化闭包?
我认为最好用一个例子来问这个问题:
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
当我转储 /tmp/sub.store
时,我看到:
$VAR1 = sub {
package Storable;
use warnings;
use strict 'refs';
my($y) = @_;
return $x + $y;
}
但是 $x
从未在此子中定义。我希望由 sub_generator
生成的 sub 在生成时将 $x
替换为其实际值。我应该如何解决这个问题?
请注意,此问题与此一个相关。
I think this might be best asked using an example:
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
When I dump /tmp/sub.store
I see:
$VAR1 = sub {
package Storable;
use warnings;
use strict 'refs';
my($y) = @_;
return $x + $y;
}
But $x
is never defined in this sub. I would expect that the sub generated by sub_generator
will have $x
replaced with its actual value upon generation. How should I solve this?
Note this question relates to this one.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不幸的是,我认为
Storable
不适用于闭包。然而,还有其他 CPAN 模块可以序列化闭包。例如。Data::Dump::Streamer
这是此处打印的序列化代码是什么样子的,
说 Dump $sub;
:更新
请参阅此帖子 Perl5 搬运工邮件列表中的可存储和闭包。它证实了我对
Storable
和闭包的想法。/I3az/
Unfortunately I don't think
Storable
works with closures. However there are other CPAN modules that will serialise a closure. For eg.Data::Dump::Streamer
This is what the serialised code looks like when printed here,
say Dump $sub;
:Update
See this thread Storable and Closures on the Perl5 porters mailing list. It confirms what I thought about
Storable
and closures./I3az/