Perl的淺拷貝和深度拷貝

首先是深、淺拷貝的概念:

  • 淺拷貝:shallow copy,只拷貝第一層的數據。Perl中賦值操作就是淺拷貝
  • 深拷貝:deep copy,遞歸拷貝所有層次的數據,Perl中Clone模塊的clone方法,以及Storable的dclone()函數是深拷貝

所謂第一層次,指的是出現嵌套的復雜數據結構時,那些引用指向的數據對象屬于深一層次的數據。例如:

@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}的第一層數據,也就是兩個元素和一個引用,拷貝引用時不會對引用進行遞歸拷貝給賦值對象。簡單地說,淺拷貝的過程就是源數據是怎樣的,拷貝后就是怎樣的。

如下圖:

733013-20180928214345464-212030330.png

因為淺拷貝時引用不會進行遞歸,所以拷貝前后的兩個對象都指向同一個引用。所以修改它們共同引用的數據,同時也會修改另一份數據。例如:

@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引用的數據對象是相同的。

深拷貝:Clone和Storable

為了在拷貝階段保護引用的數據對象,Perl提供了深拷貝的方式。它會對引用進行遞歸,拷貝引用所指向的數據對象。如圖:

733013-20180928221110289-2108799838.png

也就是說,深拷貝的方式使得拷貝前后出現了兩個完全獨立的、互不影響的數據對象,修改其中任何一個對象都不會影響另一個。

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模塊,他是用來實現數據持久化的主要工具,后面會有專門的文章詳細介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員分析報告(2018)-總結篇

一、生活中的程序員 居住篇 在主要職業群體中,程序員更傾向于租房,20.9%的受訪程序員目前自己有房,此比例明顯低于其他職業。大概是因為程序員大部分還比較 年輕,傳說中的超高薪水并不能讓很多人擁有自己的房子而更長的工作…

linux lvm 查看,Linux LVM 詳解

邏輯卷管理LVM是一個多才多藝的硬盤系統工具。無論在Linux或者其他類似的系統,都是非常的好用。傳統分區使用固定大小分區,重新調整大小十分麻煩。但是,LVM可以創建和管理“邏輯”卷,而不是直接使用物理硬盤。可以讓管理員彈性的管…

cnblogs修改網站圖標icon

以下修改網絡地址即可 <script type"text/javascript" language"javascript">//Setting ico for cnblogsvar linkObject document.createElement(link);linkObject.rel "shortcut icon";linkObject.href "icon的網絡地址";do…

maven settings.xml國內倉庫配置

<?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.…

智慧園區-樓宇建模技巧之【建樓篇】

一、國際慣例先上圖 二、有什么用&#xff1f;用什么搞的&#xff1f;花了多久&#xff1f; 用途 室內定位(會議室、停車位查找等)安防監控(直接定位到某個樓道的攝像頭拉取視頻流)各種傳感器數據三維可視化請問哪里可以買到呢(含笑半步癲2333) 我這里正好有一個。https://iot.…

android meta工具,android ota 升級包制作分析 (5 工具)

工具1 mkbootfsmkbootfs的源代碼在system/core/cpio中。??mkbootfs -f boot_filesystem_config.txt targetfiles/BOOT/RAMDISK | minigzip > ramdisk.img2 mkbootimgmkbootimg的源代碼在system/core/mkbootimg中。mkbootimg --kernel kernel --ramdisk ramdisk.img --outp…

asp.net core輸出中文亂碼的問題

原文:asp.net core輸出中文亂碼的問題 摘要 在學習asp.net core的時候&#xff0c;嘗試在控制臺&#xff0c;或者頁面上輸出中文&#xff0c;會出現亂碼的問題。 問題重現 新建控制臺和站點 public class Program{public static void Main(string[] args){ Console.W…

android oom工具,Android OOM-Heap,MAT工具檢測內存泄露

概述在android的開發中&#xff0c;要時刻主要內存的分配和垃圾回收&#xff0c;因為系統為每一個dalvik虛擬機分配的內存是有限的&#xff0c;在google的G1中&#xff0c;分配的最大堆大小只有16M&#xff0c;后來的機器一般都為24M&#xff0c;實在是少的可憐。這樣就需要我們…

windows 端微信多開

假設微信安裝目錄為 "E:\Program Files\WeChat\WeChat.exe" 打開記事本&#xff0c;復制一下命令&#xff0c;保存為 bat 文件 echo off start /d "E:\Program Files\WeChat\" WeChat.exe start /d "E:\Program Files\WeChat\" WeChat.exe exi…

超詳細MFS網絡分布式文件系統

-----------------------MFS---------------------- (1)分布式原理 分布式文件系統( Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上&#xff0c;而是通過計算機網絡與節點相連。簡單來說&#xff0c;就是把一些分散的(分布在局域網內各個…

markdown文件轉word文件

工具&#xff1a; https://github.com/jgm/pandoc/releases/tag/2.2.3.2 下載pandoc安裝包之后&#xff0c;像安裝普通軟件一樣點開安裝就可以了。安裝完成之后&#xff0c;打開cmd命令行&#xff0c;輸入pandoc -v&#xff0c;如果正常顯示出類似下面的信息就表明安裝成功&a…

android全面屏系統哪個版本開始,Android全面屏

所謂全面屏手機&#xff0c;就是屏幕縱橫比大于1.86的設備。例如&#xff1a;舉個例子.png官方文檔&#xff1a;If your app targets Android 8.0 (API level 26) or higher, it fills the entire screen, according to its layout.If your app targets Android 7.1 (API level…

AliOS Things聲源定位應用演示

摘要&#xff1a; 1. 概述 利用麥克風陣列進行聲源定位在智能降噪、語音增強、語音識別等領域有廣泛應用和研究前景。本文介紹基于AliOS Things STM32F413H Discovery開發板實現聲源定位算法集成和功能演示。 概述利用麥克風陣列進行聲源定位在智能降噪、語音增強、語音識別等…

Mysql 使用正則表達式

需求&#xff1a;匹配出姓名字段里非中文的 SELECT * FROM 表 WHERE REAL_NAME REGEXP ([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z\\.\\s]{1,20}) ; 查詢結果如下

Android點擊返回鍵銷毀自己,Activity界面銷毀 軟鍵盤未收回

在項目開發過程中&#xff0c;界面包含EditText輸入框時&#xff0c;輸入內容時軟鍵盤彈起。但是此時我們調用界面中自定義的返回按鈕執行.finish()方法銷毀Activity后發現軟鍵盤并沒有跟隨關閉收回&#xff0c;參考了網上各種方法后&#xff0c;試驗總結出自己項目中可用的方案…

2、Collections操作(自定義類)的各種實現

2019獨角獸企業重金招聘Python工程師標準>>> 1、排序(sort) 要想實現排序&#xff0c;必須實現compare方法&#xff0c;這樣Collection才知道是怎樣的排序規則。普通的數據類型&#xff0c;比如&#xff1a;int 、String、long等都已經實現了Comparable接口&#xf…

Mysql sql語句積累

分組排序 #alter table zxfw_offline_qa add zx_number varchar(50) COMMENT 咨詢編號&#xff0c;提問日期提問順序 AFTER id;/* select (i : case when pre_consult_timeconsult_time then i 1 else 1 end ) rownum, qa.*,(pre_consult_time:consult_time) from zxfw_…

中綴表達式轉換成后綴表達式(只適用于加減乘除運算)

1 #include <iostream>2 #include <stack>3 #include <cctype>4 5 using namespace std;6 7 //獲取符號的優先級8 int getPriority(char c)9 { 10 int priority -1; 11 switch (c) { 12 case : 13 priority 1; 14 break; 15 …

android多接口請求參數,okhttp3 使用json參數post方式請求接口數據(android)

1. 谷歌自帶的json不支持像map一樣直接put字符串進去&#xff0c;所以先導入阿里的json包2. 創建json對象&#xff0c;并且放入所要請求的參數 //登錄 private void loginRequest() { String url Contents.url"login"; JSONObject json new JSONObject(); json.put…

由淺入深,一文掌握NGINX知識文集

&#x1f3c6;作者簡介&#xff0c;普修羅雙戰士&#xff0c;一直追求不斷學習和成長&#xff0c;在技術的道路上持續探索和實踐。 &#x1f3c6;多年互聯網行業從業經驗&#xff0c;歷任核心研發工程師&#xff0c;項目技術負責人。 &#x1f389;歡迎 &#x1f44d;點贊?評論…