热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Perl:数组引用与匿名数组-Perl:arrayreferenceversusanonymousarray

ThismaybeasillyquestionThefollowingcodeoutputsthecontentsof@arrayrefand@arraycont

This may be a silly question... The following code outputs the contents of @arrayref and @arraycont respectively. Note the difference between them and the way the values of them are assigned. I know what the anonymous array does, but can anybody explain why there is a difference?

这可能是一个愚蠢的问题......以下代码分别输出@arrayref和@arraycont的内容。请注意它们之间的差异以及它们的值的分配方式。我知道匿名数组的作用,但有人可以解释为什么会有区别吗?

Thank you very much.

非常感谢你。

@arrayref = ();
@array = qw(1 2 3 4);
$arrayref[0] = \@array;
@array = qw(5 6 7 8);
$arrayref[1] = \@array;
print join "\t", @{$arrayref[0]}, "\n";
print join "\t", @{$arrayref[1]}, "\n";

@arraycOnt= ();
@array = qw(1 2 3 4);
$arraycont[0] = [@array];
@array = qw(5 6 7 8);
$arraycont[1] = [@array];
print join "\t", @{$arraycont[0]}, "\n";
print join "\t", @{$arraycont[1]}, "\n";

outputs

输出

5   6   7   8   
5   6   7   8   
1   2   3   4   
5   6   7   8   

3 个解决方案

#1


11  

This creates a shallow copy of the array:

这将创建数组的浅表副本:

$arraycont[0] = [@array];

$ arraycont [0] = [@array];

Whereas this just creates a reference to it:

虽然这只是创建了它的引用:

$arrayref[0] = \@array;

$ arrayref [0] = \ @array;

Since you later modify the array:

由于您以后修改了数组:

@array = qw(5 6 7 8);

@array = qw(5 6 7 8);

arrayref still points to the same array location in memory, and so when dereferenced in the print statements it prints the current array values 5 6 7 8.

arrayref仍指向内存中的相同数组位置,因此当在print语句中取消引用时,它会打印当前数组值5 6 7 8。

#2


3  

The first block stores the address of @array. REferences are like 'live streaming', you get current status. So if you create a reference to @array, like \@array, when you de-reference it you will always get what @array points at the moment of de-reference. When you de-refer @array was having (5 6 7 8)

第一个块存储@array的地址。引用就像“直播”,您获得当前状态。因此,如果您创建对@array的引用,例如\ @array,当您取消引用它时,您将始终获得@array在取消引用时指向的内容。当你取消推荐@array有(5 6 7 8)

When you do [@array] its like recording the live streaming into your disk. So when you (re)play the recorded content you get what was streamed at the time of recording. So when you refer $arraycont[0] you get what @array was having at the time of copying that is
(1 2 3 4)

当你执行[@array]时,就像将实时流媒体录制到磁盘中一样。因此,当您(重新)播放录制的内容时,您将获得录制时流式播放的内容。所以当你引用$ arraycont [0]时,你会得到@array在复制时所拥有的内容(1 2 3 4)

#3


0  

You made stored references to a single array in both $arrayref[0] and $arrayref[1]. You should have used different arrays.

您在$ arrayref [0]和$ arrayref [1]中对单个数组进行了存储引用。你应该使用不同的数组。

my @refs;

my @array1 = qw(1 2 3 4);
push @refs, \@array1;

my @array2 = qw(5 6 7 8);
push @refs, \@array2;

In practice, my is executed in each pass of a loop, creating a new array each time.

实际上,我在循环的每次传递中执行,每次都创建一个新数组。

my @refs;
while ( my @row = get() ) {
   push @refs, \@row;
}

In rare occasions where you have to clone an array, you can use:

在极少数情况下,您必须克隆数组,您可以使用:

use Storable qw( dclone );

push @refs, [ @row ];       # Shallow clone
push @refs, dclone(\@row);  # Deep clone

推荐阅读
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
VW旻shi只吃货8453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有