Perl数组和hash相关函数

内置的数组函数有:

each, keys, pop, push, shift, splice, unshift, values

内置的hash函数有:

delete, each, exists, keys, values

有些是重复的。所以放在一起解释。

数组相关函数:

  • push:将单元素或一个列表追加到数组的尾部,返回追加后的数组长度具体示例push
  • pop:删除数组中的最后一个元素,返回被pop掉的元素,具体示例top
  • unshift:将单元素或一个列表追加到数组的首部,返回追加后的数组长度具体示例push
  • shift:删除数组中的第一个元素,返回被shift掉的元素,具体示例top
  • splice:从指定位置处删除、插入元素,具体示例splice

hash相关函数:(比较简单,所以不介绍)

  • delete:删除给定key
  • exists:测试key是否存在于hash中

共同函数:(比较简单,所以不介绍)

  • keys:获取hash或数组(5.12版本才开始提供)的key,对于数组,则是返回索引位置。对于hash,返回的key的顺序是不确定的
  • values:返回hash或数组(5.12版本才开始提供)的值。values返回的元素顺序和keys返回的顺序是一致的
  • each:遍历hash或数组

push & unshift

将一个列表追加到一个数组的尾部,返回追加后数组的长度。

push ARRAY,LIST
unshift ARRAY,LIST
  • push是将一个列表(可能只有一个元素)追加到数组的最尾部
  • unshift则是将一个列表(可能只有一个元素)追加到数组的最前面
  • 它们返回追加后数组的长度
  • 追加列表的时候,不是每次追加一个元素,而是一次追加一整个列表,所以新追加到数组中的元素顺序保持不变

注意,unshift在数组开头追加一个列表,会导致数组中原有的元素索引整体后移。例如原数组内容为a b c d,unshift一个新元素后,a就变成第二个元素,索引位置从0变成1,b的索引位置从1变成2,c的索引位置从2变成3,d的索引位置从3变成4。在数组较小时,unshift并不会有什么影响,但数组较大,会严重影响效率。

例如:

@arr=qw(python shell php);
push @arr,"perl","Ruby";
print "@arr"; # 输出:python shell php perl Ruby

push的返回值为追加元素成功后,数组的长度:

@arr=qw(python shell php);
print push @arr,"perl","Ruby"; # 输出:5

pop操作,在结果上等价于:

for my $value (@LIST){
$ARRAY[++$#ARRAY] = $value;
}

但push效率更高,因为它是一次追加一整个列表,而非一次追加一个列表中的元素。

pop & shift

pop ARRAY
pop
shift ARRAY
shift
  • pop从数组中移除并返回最后一个元素
  • shift从数组中移除并返回第一个元素
  • 如果数组已空,则pop/shift返回undef
  • 如果省略ARRAY,则pop/shift操作的是@ARGV,但如果是在子程序中,则操作的是@_

注意,shift删除第一个元素会导致数组的索引位置整体向前移动。例如数组内容为a b c d,但shift一次后,b就变成了第一个元素,它的索引位置从1变成0,c的索引位置从2变成1,d的索引位置从3变成2。在数组较小时,shift并不会有什么影响,但数组较大,会严重影响效率。

例如:循环删除数组的最后一个元素

@arr=qw(python shell php);
while(my $poped = pop @arr){
print $poped,"\n"; # 依次输出:php shell python
}

当省略ARRAY时,且不在子程序中时,pop将操作@ARGV。

while(my $poped=pop){
print $poped,"\n";
}

执行它:

$ ./test.pl a.txt b.txt c.txt
c.txt
b.txt
a.txt

同理,在子程序中,则操作默认的参数数组@_。

sub mysub() {
while(my $poped=pop){
print $poped,"\n";
}
} &mysub(qw(a.txt b.txt c.txt)); # 将依次输出c.txt b.txt a.txt

splice

pop/push、unshift/shift操作的都是数组的开头,或者末尾。splice(中文译为:粘接)则可以指定操作数组中的哪个位置。

splice ARRAY
splice ARRAY,OFFSET
splice ARRAY,OFFSET,LENGTH
splice ARRAY,OFFSET,LENGTH,LIST
  • splice在移除元素时,在列表上下文返回被移除的元素列表,标量上下文返回最后一个被移除的元素

1.一个参数时,即splice ARRAY,表示清空ARRAY。

use 5.010;
@arr=qw(perl py php shell); @new_arr=splice @arr;
say "original arr: @arr"; # 输出:空
say "new arr: @new_arr"; # 输出原列表内容

如果splice在标量上下文,则返回最后一个被移除的元素:

use 5.010;
@arr=qw(perl py php shell); $new_arr=splice @arr;
say "$new_arr"; # 输出:shell

2.两个参数时,即splice ARRAY,OFFSET,表示从OFFSET处开始删除元素直到结尾。

注意,OFFSET可以是负数。

例如:

use 5.010;
@arr=qw(perl py php shell); @new_arr=splice @arr,2;
say "original arr: @arr"; # 输出:perl py
say "new arr: @new_arr"; # 输出:php shell

如果offset为负数,则表示从后向前数第几个元素,-1表示最后一个元素。

use 5.010;
@arr=qw(perl py php shell); @new_arr=splice @arr,-3;
say "original arr: @arr"; # 输出:perl
say "new arr: @new_arr"; # 输出:py php shell

3.三个参数时,即splice ARRAY,OFFSET,LENGTH,表示从OFFSET处开始向后删除LENGTH个元素。

注意,LENGTH可以为负数,也可以为0,它们都有奇效。

例如:

use 5.010;
@arr=qw(perl py php shell ruby); @new_arr=splice @arr,2,2;
say "original arr: @arr"; # 输出:perl py ruby
say "new arr: @new_arr"; # 输出:php shell

如果length为负数(假设为-3),则表示从offset处开始删除,直到尾部还保留-length个元素(-3时,即表示尾部保留3个元素)。例如:

use 5.010;
@arr=qw(perl py php shell ruby java c c++ js); @new_arr=splice @arr,2,-2; # 从php开始删除,最后只保留c++和js两个元素
say "original arr: @arr"; # 输出:perl py c++ js
say "new arr: @new_arr"; # 输出:php shell ruby java c

如果正数length的长度超出了数组边界,则删除结尾。如果负数length超出了边界,也就是保留的数量比要删除的数量还要多,这时保留优先级更高,也就是不会删除。例如,从某个位置开始删除,后面还有2个元素,但如果"length=-2",则这两个元素不会被删除。

如果length为0,则表示不删除,这个在有第4个参数LIST时有用。

4.四个参数时,即splice ARRAY,OFFSET,LENGTH,LIST,表示将LIST插入到删除的位置,也就是替换数组的部分位置连续的元素。

例如:

use 5.010;
@arr=qw(perl py php shell ruby);
@list=qw(java c); @new_arr=splice @arr,2,2,@list;
say "original arr: @arr"; # 输出:perl py java c ruby
say "new arr: @new_arr"; # 输出:php shell

如果想原地插入新元素,而不删除任何元素,可以将length设置为0,它会将新列表插入到offset的位置。

use 5.010;
@arr=qw(perl py php shell ruby);
@list=qw(java c); @new_arr=splice @arr,2,0,@list;
say "original arr: @arr"; # 输出:perl py java c php shell ruby
say "new arr: @new_arr"; # 输出:空

注意上面php在新插入元素的后面。

splice功能非常好用,在不少语言中,要实现类似的功能,需要借助链表的方式来实现,比较复杂。splice一个函数即可,方便的多,但链表毕竟增、删元素的效率高,所以对于大数组又要频繁增删改的时候,还是是现成链表比较好。

Perl数组和hash相关函数的更多相关文章

  1. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...

  2. Perl匿名数组、hash和autovivification特性

    可有构建匿名的对象,这样就没必要去为只用一两次的数组.hash去取名字,有时候取名是很烦的事. 使用中括号[]构建匿名数组 使用大括号{}构建匿名hash 不包含任何元素的[]和{}分别是匿名空数组. ...

  3. Perl中的hash类型

    hash类型 hash类型也称为字典.关联数组.映射(map)等等,其实它们都是同一种东西:键值对.每一个Key对应一个Value. hash会将key/value散列后,按序放进hash桶.散列后的 ...

  4. Perl函数:字符串相关函数

    Perl字符串相关函数 字符串的内置函数有: chomp, chop, chr, crypt, fc, hex, index, lc, lcfirst, length, oct, ord, pack, ...

  5. Perl Learning 5 Hash

    [本文原创,未经同意请勿转载] 哈希是一种数据结构,它和数组的相似之处在于能够容纳随意多的值并能按需取用,而它和数组的不同在于索引方式,数组是以数字来索引.哈希则以名字来索引.也就是说.哈希的索引值, ...

  6. perl 数组快速去除重复元素

    这里记录两种perl数组去重的办法,一种利用哈希(hash),一种直接利用perl自带的模块List::MoreUtils内部的函数uniq. 一.利用hash去重 示例代码如下: 1 #!/usr/ ...

  7. 数组和Hash表

    数组和Hash表 当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Obje ...

  8. perl数组的长度与元素个数

    perl数组的长度与元素个数 $#数组名 ---表示数组中最后一个元素的下标,它等于元素个数减1. @数组名 ---表示数组中元素的个数. $标量=@数组名 ---将一个数组赋值给一个标量变量,标量得 ...

  9. 用链表和数组实现HASH表,几种碰撞冲突解决方法

    Hash算法中要解决一个碰撞冲突的办法,后文中描述了几种解决方法.下面代码中用的是链式地址法,就是用链表和数组实现HASH表. he/*hash table max size*/ #define HA ...

随机推荐

  1. Django之路

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...

  2. Exp 8 Web基础

    Exp 8 Web基础 20154305 齐帅 一.实践要求: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. ...

  3. CSS伪类的理解

    因为之前一直对css伪类没有过多的了解,在网上看到一段css代码,不能理解 a:hover span.title{ color:red; ......... } 现通过查询css手册,其实css伪类只 ...

  4. Django积木块八——三级联动

    三级联动 前端需要的效果,省之后市之后现,创建model,查询所有的省的信息,json传到前面,之后通过省的id找到对应的市,是用异步实现的. # model class Sheng(models.M ...

  5. 性能测试---CPU内存部分

    CPU内存的测试可以通过top命令来测试 ,如下是我写的bat脚本,其中的测试进程可以替换为你自己需要测试的进程. @echo offecho============================= ...

  6. 端口转发 Port Forwarding (一)

    0x00First 最近发现一些好用的端口转发工具和技巧,计划认真梳理一下 SSH.NC.LCX.EW.FRP 0x01 SSH隧道端口转发 目前利用SSH隧道(SSH tunneling)进行端口转 ...

  7. 基本数据类型的包装类(Interger)

    基本数据类型 vs包装类 byte Byte short Short char Character int Integer long Long float Float double Double bo ...

  8. 自兴人工智能 python特点了解

    计算机语言从语言执行分类来看,大概可分为编译型语言(如Java.c++)和解释型语言(如python.javascript) 1.编译型语言  java   c++ 编写源代码.java ---> ...

  9. ZJOI2019二试游记

    ZJOI2019二试游记 Day -2 今天就要去被虐了!开一篇占个坑.禁赛警告 Day -1 早上zzy,下午zzq,无限懵逼... 过来的时候Sooke,memset0,老K坐我旁边,瑟瑟发抖.. ...

  10. javascript之location详解

    window.location.hash 使用说明 今天给大家详细汇总了关于window.location.hash的知识点,属性以及用法等等,非常的实用,并附上了例子,有需要的小伙伴可以参考下. l ...