gpt4 book ai didi

perl - 如何在 Perl 中序列化闭包?

转载 作者:行者123 更新时间:2023-12-04 15:15:44 24 4
gpt4 key购买 nike

我认为这可能最好用一个例子来问:

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 生成的子将有 $x在生成时被其实际值(value)所取代。我应该如何解决这个问题?

请注意,此问题与 one 有关.

最佳答案

不幸的是,我不认为 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

这是此处打印的序列化代码的样子, 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;
};

更新

看到这个线程 Storable and Closures在 Perl5 搬运工邮件列表上。它证实了我的想法 Storable 和关闭。

/I3az/

关于perl - 如何在 Perl 中序列化闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com