在perl中,若是想要取得一部分变量、一部分列表内容、一部分hash内容,能够采用分片(切片)的方式。php
注意,perl并未提供字符串的切片方式,但可使用内置函数substr()来实现同样的功能。python
例如,有些语言(如golang)支持空变量赋值(如golang),以便丢弃那些不许备使用的变量,perl也支持,只需在不想使用的位置上设置undef便可。golang
例如,下面的变量列表中,就丢弃了php和ruby对应的赋值操做。shell
@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的位置和数量,就会出错,并且有些时候只是想取得值即刻使用,而不想将其赋值给变量存储起来再经过变量来引用。因而,切片就排上用场了。ruby
先看列表切片:函数
qw(aaa bbb ccc ddd)[1,2];
这表示将列表(aaa bbb ccc ddd)进行切片,取出其中索引位为1和2的元素,因为索引位从0开始计算,因此表示取出(bbb ccc)。code
例如,下面的例子中屡次取了索引位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;
多数时候,数组切片和列表切片是等价的,可是有两点不一样:
第一点,示例以下:
@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切片和数组切片行为上相似,但写法上可能有些使人疑惑。例如:
%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_name
如下三种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";