Perl的浅拷贝和深度拷贝
首先是深、浅拷贝的概念:
所谓第一层次,指的是出现嵌套的复杂数据结构时,那些引用指向的数据对象属于深一层次的数据。例如: @Person1=('wugui','tuner'); @Person2=('longshuai','xiaofang',['wugui','tuner']); @Person3=('longshuai',@Person1);
当进行赋值时,拷贝给目标的只是第一层数据对象。 @[email?protected]; @[email?protected]; @[email?protected]; 拷贝给 如下图: 因为浅拷贝时引用不会进行递归,所以拷贝前后的两个对象都指向同一个引用。所以修改它们共同引用的数据,同时也会修改另一份数据。例如: @Person=('longshuai','tuner']); @[email?protected]; $Person_shallow[2][1]="fairy"; say "$Person_shallow[2][1]"; # 输出:fairy say "$Person[2][1]"; # 输出:fairy 上述例子中只是给 为了在拷贝阶段保护引用的数据对象,Perl提供了深拷贝的方式。它会对引用进行递归,拷贝引用所指向的数据对象。如图: 也就是说,深拷贝的方式使得拷贝前后出现了两个完全独立的、互不影响的数据对象,修改其中任何一个对象都不会影响另一个。 Perl提供了一个Clone包(现在包的概念就是模块),它的clone()可以递归拷贝,也就是深拷贝。Storable模块也提供了dclone()函数进行深拷贝。在拷贝层次低于或等于3层时,Clone()的拷贝速度更快,在层次大于或等于4层时,dclone()速度更快。 需要注意,clone()和dclone()的参数都必须是引用变量,当然,也可以是 例如,使用Clone的clone()方法进行深拷贝: shell> cpan -i Clone use 5.010; use Clone qw(clone); @Person=('longshuai','tuner']); $Person_deep=clone(@Person); $Person[2][1]="fairy"; say "$Person[2][1]"; # 输出:fairy say "$Person_deep->[2][1]"; # 输出:tuner 同样,使用Storable模块的dclone()。 use 5.010; use Storable qw(dclone); @Person=('longshuai','tuner']); $Person_deep=dclone(@Person); $Person[2][1]="fairy"; say "$Person[2][1]"; # 输出:fairy say "$Person_deep->[2][1]"; # 输出:tuner 关于Storable模块,他是用来实现数据持久化的主要工具,后面会有专门的文章详细介绍。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |