Perl:如何深层复制一个受祝福的对象?

vol*_*ron 9 oop perl deep-copy bless

我希望做一个深刻的(在这一点上,浅薄可能就足够了)一个受祝福的物体的副本.

Foo类

package Foo;
our $FOO = new Foo;       # initial run

sub new {
   my $class = shift;
   my $self  = {};
   bless $self, $class;
   return $self;
}
Run Code Online (Sandbox Code Playgroud)

主要计划

use Foo;
my $copy = $Foo::FOO;     # instead of creating a ref, want to deep copy here
$copy->{bar} = 'bar';
Run Code Online (Sandbox Code Playgroud)

bar出现在两者$Foo::FOO$copy.我意识到我可以通过设置为对象来创建对象的副本$copy = { %{$Foo::FOO} },但随后它将不再受到祝福; 另外,这只适用于简单的数据结构(现在不是问题).是这种方式复制然后保佑(例如$copy = bless { %{$Foo::FOO} }, q{Foo};)的唯一方法吗?

我试图避免使用Moose,Clone或其他非核心模块/软件包,因此在回复时请记住这一点. 粗体所以它更突出:)

cho*_*oba 11

复制应该是API的一部分.模块的用户永远不会知道在创建新对象时需要执行哪些特殊操作(考虑my在包中的散列中注册每个对象).

因此,clone为您的对象提供一种方法.在它里面,你可以使用你喜欢的任何脏技巧:

sub clone {
    my $self = shift;
    my $copy = bless { %$self }, ref $self;
    $register{$copy} = localtime; # Or whatever else you need to do with a new object.
    # ...
    return $copy;
}
Run Code Online (Sandbox Code Playgroud)

  • `bless {%$ self},ref $ self`技术只会做一个浅拷贝.不会克隆作为引用的`$ self`的属性.例如,`$ obj - > {ponies} = [qw(Dash Sparkle Jack)]; $ clone = $ obj-> clone; push @ {$ clone - > {ponies}},"Pinkie"`将修改两个对象. (3认同)

Zai*_*aid 9

use Storable 'dclone';

$ corelist Storable

Storable was first released with perl v5.7.3
Run Code Online (Sandbox Code Playgroud)

另外,你可以摆弄Storable钩子,以便更好地控制复制你的对象(不是我已经完成了,但这就是文档所声称的).