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.mzph.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;点赞✍评论…