分片(slice)

在perl中,如果想要取得一部分变量、一部分列表内容、一部分hash内容,可以采用分片(切片)的方式。

注意,perl并未提供字符串的切片方式,但可以使用内置函数substr()来实现一样的功能。

空变量赋值

例如,有些语言(如golang)支持空变量赋值(如golang),以便丢弃那些不准备使用的变量,perl也支持,只需在不想使用的位置上设置undef即可。

例如,下面的变量列表中,就丢弃了php和ruby对应的赋值操作。

@arr=qw(python perl shell php ruby);
($py,$perl,$shell,undef,undef) = @arr;

perl中有些函数(比如stat和localtime)在列表上下文会返回很多个字段值列表,这时空变量赋值的方式就排上用场了:

($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime();

但是这样的赋值方式还是麻烦,弄错了undef的位置和数量,就会出错,而且有些时候只是想取得值即刻使用,而不想将其赋值给变量存储起来再通过变量来引用。于是,切片就排上用场了。

数组切片

先看列表切片:

qw(aaa bbb ccc ddd)[1,2];

这表示将列表(aaa bbb ccc ddd)进行切片,取出其中索引位为1和2的元素,由于索引位从0开始计算,所以表示取出(bbb ccc)。

  • 切片返回的是一个列表,所以可以方便地对取出的元素赋值
  • 切片中括号中的索引值只要不越界,可以随意写,且可以重复
  • 切片的索引中需要的一个列表
  • "-1"索引位表示从后向前取的倒数第一个元素,同理"-2"表示倒数第二个
  • 中括号中的逗号不是表示范围,而是索引位分隔符

例如,下面的例子中多次取了索引位1和2的元素,且索引位完全乱序的,但这些行为都是允许的。

qw(aaa bbb ccc ddd perl shell python)[1,-1,3,2,0,1,2];

由于索引位是列表,所以使用范围序列的方式也是允许的:

qw(aaa bbb ccc ddd perl shell python)[1..3]; # 等价于 [1,2,3]

再看数组切片。所谓数组切片,实际上是将数组转换为列表(数组底层就是列表),再通过列表的有序性来切片。例如:

@arr = qw(aaa bbb ccc ddd);
($a,$b) = @arr[1,3];
print $a,$b;

多数时候,数组切片和列表切片是等价的,但是有两点不同:

  1. 数组切片可以放在双引号中被解析,从而进行数组的切片替换,而列表切片则不能解析
  2. 可以将一系列值赋值给数组切片(也就是切片表达式在等号左边),从而实现修改数组元素的目的

第一点,示例如下:

@arr=qw(perl python shell php);
print "@arr[1,2,3]\n"; # 成功切片
print qw(aaa bbb ccc ddd)[1,2],"\n"; # 成功切片
print "qw(aaa bbb ccc ddd)[1,2]\n"; # 不会切片,而是直接当字符串输出

第二点,示例如下:

@arr=qw(perl python shell php);
@arr[1,2]=qq(cpython csh); # 将数组的元素python改为cpython,shell改为csh
print "new arr: @arr\n";

范围切片时使用M..N的方式,如果想要切到倒数第2个元素呢?指定N为-2吗?这肯定是错的。所以如果想切到倒数第某个元素,可以使用($#arr-N+1)的方式来表示倒数第N个,例如5个元素的数组,$#arr为4,倒数第1个为$#arr - 0,倒数第二个为$#arr - 1。示例:

@arr=qw(perl python shell php);
print @arr[0..($#arr - 2)];

hash切片

hash切片和数组切片行为上类似,但写法上可能有些令人疑惑。例如:

%phone_num=(longshuai =>"18012345678",
xiaofang =>"17012345678",
tun_er =>"16012345678",
fairy =>"15012345678"); ($a,$b,$c)=@phone_num{qw(xiaofang fairy xiaofang)};
print $a,"\n",$b,"\n",$b,"\n";

几个需要说明的地方:

  • 尽管是hash切片,切片使用的符号仍然是@,例如@hash_name
  • 切片过程使用大括号包围想要取得的hash键列表
  • 切片的索引是hash键,而非从0开始计算的数值索引位
  • 取多个切片元素时,大括号中的hash键是一个由键组成的列表
  • 可以将一系列值赋值给hash切片(也就是切片表达式在等号左边),从而实现修改hash元素值的目的
  • hash是不能在双引号中进行替换的,但是hash切片可以在双引号中替换

以下三种hash键形式都是允许的:

@phone_num{qw(xiaofang fairy xiaofang)};
@phone_num{("xiaofang","fairy","xiaofang")};
@phone_num{"xiaofang","fairy","xiaofang"};

和数组切片可以赋值一样,也可以为hash的切片元素赋值,从而实现修改对应键值对的值。

%phone_num=(longshuai =>"18012345678",
xiaofang =>"17012345678",
tun_er =>"16012345678",
fairy =>"15012345678"); @number=qw(18087654321 17087654321);
@phone_num{qw/longshuai xiaofang/} = (@number);
print "@phone_num{qw/longshuai xiaofang/}","\n";

Perl分片技术的更多相关文章

  1. 在C#中实现Python的分片技术

    在C#中实现Python的分片技术 前言 之前在学习Python的时候发现Python中的分片技术超好玩的,本人也是正则表达式热爱狂,平时用C#比较多,所以决定把Python中的分片技术在C#中实现, ...

  2. 8天学通MongoDB——第六天 分片技术

    在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针对这样的场景我们该如何应对. 一:分片 mong ...

  3. MongoDB分片技术[转]

    8天学通MongoDB——第六天 分片技术   在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针 ...

  4. MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片

    MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...

  5. 区块链公链分片技术(sharding)方案,配思维导图

    区块链公链分片技术(sharding)方案,配思维导图 分片技术(sharding)方案 以太坊分片思路 其基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之 ...

  6. MySQL数据库分片技术调研

    将这段时间了解的MySQL分片技术和主从复制只是整理清楚画了思维导图记录一下,希望能给需要的人一些帮助 P.S.:个人整理,可能会有错误之处,还望指出~ 要解决的问题 1.海量数据的操作超出单表.单库 ...

  7. MongoDB分片技术原理和高可用集群配置方案

    一.Sharding分片技术 1.分片概述 当数据量比较大的时候,我们需要把数分片运行在不同的机器中,以降低CPU.内存和Io的压力,Sharding就是数据库分片技术. MongoDB分片技术类似M ...

  8. Mysql数据分片技术(一)——初识表分区

    1. 为什么需要数据分片技术 2. 3种数据分片方式简述 3. 分片技术原理概述 4. 对单表分区的时机 1为什么需要数据分片技术 数据库产品的市场 在互联网行业内,绝大部分开发人员都会遇到数据表的性 ...

  9. mongodb 分片技术

    MongoDB Sharding Cluster 分片集群 规划:10个实例:38017-38026 (1)configserver:3台构成的复制集(1主两从,不支持arbiter)38018-38 ...

随机推荐

  1. post文件下载

    this.$http({ method: 'post', url: '/file/download', responseType: 'blob', data: JSON.stringify(this. ...

  2. LAPM 相关实验01

    目录 lab1 静态.动态资源的区别lab2 部署phpMyadminlab3 部署wordpresslab4 编译安装php-Xcache加速器lab5 fcgi实现lamp lab1 静态.动态资 ...

  3. OOP随笔

    父类为普通类: 内部可声明虚方法(virtual),并包含代码实现,子类中可以重写(override),也可以不重写直接用. 父类为(不可实例化的)抽象类: 可声明虚方法,同上. 也可以声明抽象方法( ...

  4. vshost32-clr2.exe 已停止工作

    软件中使用了DevComponents.DotNetBar2.dll MessageBoxEx.Show("ddd");运行到这句出现如上错误 解决:在项目属性里->调试: ...

  5. 转 多租户SaaS架构

    当使用Techcello框架开发云端多租户SaaS应用程序时,它继承了经过验证和测试的架构蓝图和工程结构.但开发人员仍然会保留灵活性,自由和控制权,以修改和扩展能力以适应其应用要求.此外,SaaS平台 ...

  6. kubernets基础

    1.定义和功能. 1.1定义:kubernets解释为舵手或者飞行员,以Borg为主衍生出. 1.2功能:自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚. 密钥和配置管理,存储编排, ...

  7. 《Node.js高级编程》之Node 核心API基础

    Node 核心API基础 第三章 加载模块 第四章 应用缓冲区 第五章 事件发射器模式简化事件绑定 第六章 使用定时器制定函数执行计划 第三章 加载模块 本章提要 加载模块 创建模块 使用node_m ...

  8. CLion之C++框架篇-优化框架,单元测试(二)

    背景   结合上一篇CLion之C++框架篇-安装工具,基础框架的搭建(一),继续进行框架优化!   googletest(GTest)是Google开源的C++测试框架,与CLion组合,对C++环 ...

  9. 高手养成计划基础篇-Linux第二季

    高手养成计划基础篇-Linux第二季   本文来源:i春秋社区-分享你的技术,为安全加点温度   前言 前面我们学习了文件处理命令和文件搜索命令,简单的了解了一下Linux,但是仅仅了解这样还不行,遇 ...

  10. Javascript高级编程学习笔记(27)—— BOM(1)window对象1

    ECMAScript是JS的核心 但是对于在浏览器中运行的JS,BOM显然才是真正的核心 我们知道JS是由三个部分组成的 BOM.DOM.ECMAScript 之前的文章我们主要介绍的是ECMAScr ...