首先是深、淺拷貝的概念:shell
所謂第一層次,指的是出現嵌套的複雜數據結構時,那些引用指向的數據對象屬於深一層次的數據。例如:數據結構
@Person1=('wugui','tuner'); @Person2=('longshuai','xiaofang',['wugui','tuner']); @Person3=('longshuai','xiaofang',\@Person1);
@Person1
只有一層深度,@Person2
和@Person3
都有兩層深度。函數
當進行賦值時,拷貝給目標的只是第一層數據對象。工具
@Person1_shallow=@Person1; @Person2_shallow=@Person2; @Person3_shallow=@Person3;
拷貝給@Person1_shallow
的是整個@Person1
數據,它們在結果上徹底等價,拷貝給@Person{2,3}_shallow
的是@Person{2,3}
的第一層數據,也就是兩個元素和一個引用,拷貝引用時不會對引用進行遞歸拷貝給賦值對象。簡單地說,淺拷貝的過程就是源數據是怎樣的,拷貝後就是怎樣的。ui
以下圖:3d
由於淺拷貝時引用不會進行遞歸,因此拷貝先後的兩個對象都指向同一個引用。因此修改它們共同引用的數據,同時也會修改另外一份數據。例如:code
@Person=('longshuai','xiaofang',['wugui','tuner']); @Person_shallow=@Person; $Person_shallow[2][1]="fairy"; say "$Person_shallow[2][1]"; # 輸出:fairy say "$Person[2][1]"; # 輸出:fairy
上述例子中只是給@Person_shallow
進行了元素修改操做,但同時卻把原始數據@Person
也改了。由於@Person_shallow
和@Person
引用的數據對象是相同的。對象
爲了在拷貝階段保護引用的數據對象,Perl提供了深拷貝的方式。它會對引用進行遞歸,拷貝引用所指向的數據對象。如圖:blog
也就是說,深拷貝的方式使得拷貝先後出現了兩個徹底獨立的、互不影響的數據對象,修改其中任何一個對象都不會影響另外一個。遞歸
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','xiaofang',['wugui','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','xiaofang',['wugui','tuner']); $Person_deep=dclone(\@Person); $Person[2][1]="fairy"; say "$Person[2][1]"; # 輸出:fairy say "$Person_deep->[2][1]"; # 輸出:tuner
關於Storable模塊,他是用來實現數據持久化的主要工具,後面會有專門的文章詳細介紹。