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. 20155205 郝博雅 Exp7 网络欺诈防范

    20155205 郝博雅 Exp7 网络欺诈防范 一.实践内容 (1)简单应用SET工具建立冒名网站 (1分) (2)ettercap DNS spoof (1分) (3)结合应用两种技术,用DNS ...

  2. Python 获取车票信息

    提示:该代码仅供学习使用,切勿滥用!!! 先来一个git地址:https://gitee.com/wang_li/li_wang 效果图: 逻辑: 1.获取Json文件的内容 2.根据信息生成URL ...

  3. entity framework 上下文对象跟踪相关

    entity framework 上下文对于对象的跟踪有2中方式进行控制,第一种从数据库查询但不加载到上下文. 这里可以用到.AsNoTracing()方法. 这里用到的是实体(entity)在上下文 ...

  4. latex_引用参考文献格式,引用多篇参考文献

    以下内容在TeXstudio中实现: LaTeX 标准选项及其样式命令为: \bibliographystyle{type} 共有以下8种: plain,按字母的顺序排列,比较次序为作者.年度和标题. ...

  5. SQL数据库约束、默认和规则

    数据的完整性 实体完整性 又称为行完整性,即数据库中的所有行都具有一个非空且没有重复的主键值 MSSQL中通过唯一索引.PRIMARY KEY约束.UNIQUE约束.INDENTITY属性等来强制主键 ...

  6. Nuget4.0 bug一粒

    这个锅到底是nuget的还是msbuild的我也不是很确定 在使用Nuget4.0打包编译项目时 当执行到nuget pack %%~dpna.csproj -build -Prop Configur ...

  7. 从零开始单排学设计模式「简单工厂设计模式」黑铁 III

    阅读本文大概需要 2 分钟. 本篇是设计模式系列的第二篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算 ...

  8. Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记

    第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...

  9. 本地语音识别开源软件pocketsphinx调试总结

    1问题一: fatal error: pocketsphinx.h: No such file or directory 解决方法: $ cd /usr/include $ sudo ln -s /m ...

  10. 如何解决git====push 过程中出现的。error: failed to push some refs

    当我们在利用git  push 文件到仓库时出现了一下问题: ! [rejected] master -> master (fetch first)error: failed to push s ...