(1,2,"perl","python") ("var1","var2","var3") () # 空列表
if(defined(())){ # 对空列表()进行判断 print "defined"; }else{ print "undefined"; # 返回此行 }
(1,2,3,) # 等价于(1,2,3) (1,2,,,4) # 等价于(1,2,4)
((1,2,3),("a","b","c"))
会压扁成(1,2,3,"a","b","c")
(1..5) # 等价于(1,2,3,4,5) (1,2,3..5,7) # 等价于(1,2,3,4,5,7) (3.5..6) # 等价于(3,4,5,6) (3.5..6.5) # 等价于(3,4,5,6) (-3..2) # 等价于(-3,-2,-1,0,1,2) ($m..$n) # 范围由$m和$n决定 (a..d) # ("a","b","c","d") /^one/ .. /^two/ # 匹配从one开头的行到two开头的行 /^one/ .. eof # 匹配从one开头的行到最后一行
其实范围操做符有两种:..
和...
,它们只在匹配范围的时候有区别。例如一段文本内容为:php
start here end here second line end
若是使用/start/../end/
,那么在第一行就结束了匹配,由于第一行能同时匹配start和end,若是想要第一行匹配start,再也不匹配end,而是匹配第三行的end,那么须要使用/start/.../end/
。实际上,范围操做符的左边被匹配了称为flip,右边被匹配了称为flop,三个点的范围操做符...
表示flip以后不要当即作flop评估,而是在本次以后评估flop。java
使用qw写列表,无需加引号,无需加逗号分隔,而是使用空格分隔。python
如下两个列表等价:shell
("perl","python","shell") qw(perl python shell)
\n
)$perl="perl"; qw($perl python shell\n) # 不会作任何转换,包含三个元素"$perl"、"python"、"shell\n"
qw( perl python shell )
注意,不能在qw换行内部加上注释#
。因此,下面#
和它后面的字符串也被看成列表元素数组
qw( perl python # This is python shell )
qw/ var1 var2 var3 / qw! var1 var2 var3 ! qw% var1 var2 var3 % qw# var1 var2 var3 # # 这个有点像注释 ... qw( var1 var2 var3 ) qw< var1 var2 var3 > qw{ var1 var2 var3 } qw[ var1 var2 var3 ]
若是定界符中间要包含定界符符号,只要转义就能够了。ruby
qw/ var1 var2 \/var3 var4 /
更好的方法是换成其它定界符。函数
qw{ /root/xyz.sh /etc/xyz.sh }
($perl,$python)=("perl","python"); print $perl,"\n"; print $python,"\n";
($perl,$python)=($python,$perl);
($perl,$python,$shell) =qw(perl python shell php); # php被忽略 ($perl,$python,$shell,$php)=qw(perl python shell); # $php被赋值为undef
print qw{perl python shell}; @subject=qw{perl python shell}; print @subject;
@subject=("perl","python","shell"); @range=1..5; @subject=(@subject,"hello",@range);
()
,由于未定义,因此它自身返回undef@empty=(); if(@empty){ print "valid\n"; }else{ print "invalid\n"; # 返回此行 } @subject1=qw{perl python shell}; @subject2=(@subject,@empty,"php"); # 等价于(@subject,"php") @subject3=(@subject,undef,"php"); # 不等价于(@subject,"php")
$arr="xyz"; @arr=(var0,var1,var2); # 这是一个列表,赋值给了数组。 # 列表中的元素没有加引号包围 print $arr[0],$arr[1],$arr[2],"\n"; # 引用数组变量 print $arr; # 输出xyz print @arr,"\n"; # 输出var0var1var2 print "@arr","\n" # 输出var0 var1 var2
$#arr
表示最后一个索引值,它比数组元素个数小1(由于有个0索引)。因此$arr[$#arr]
引用的是最后一个元素($arr[-1]
也是最后一个元素)。print $arr[1.3]; # 等价于$arr[1] print $arr[-1]; # 最后一个元素 print $arr[-2]; # 倒数第二个元素 print $arr[100]; # undef print $arr[-100]; # undef print $arr[$#arr]; # 最后一个元素 print $arr[$#arr-1]; # 倒数第二个元素
@{arr}
、$#{arr},这样的引用方式能够避免歧义。@{arr1}=(var0,var1,var2)
@arr2=(var0,var1,var2); print $arr2[100]; # undef print $#arr2; # 返回2 $arr2[5]="var5" # 将填充$arr2[3],$arr2[4]为undef print $#arr2; # 返回5
@arr
。注意下面的例子中print @arr,"\n"
和print @arr."\n"
,仅仅是一个逗号和点号的区别,返回结果却彻底不一样。这就是不一样上下文环境中的执行结果。spa
@arr=(var0,var1,var2); # 数组,里面的元素不用引号包围 $arr[4]="var4"; # 直接对数组变量赋值,会自动填充$arr[3]:undef print @arr,"\n"; # 引用整个数组:var0var1var2var4 print @arr."\n"; # 输出的是5,表示的是数组中元素个数 # 由于这里的数组从列表上下文切换成了标量上下文, # 数组将返回元素个数
push函数:向数组尾部(最右边)插入元素;
pop函数:弹出(移除并返回)数组尾部的元素;当没有元素可弹时,则pop返回undef。code
pop和push用于实现堆栈,像堆盘子同样,不断往上堆,也从上面开始取。blog
@arr = 5..9; # (5,6,7,8,9) $var1 = pop(@arr); print @arr,"\n",$var1,"\n"; # 返回5678和9 $var2 = pop @arr; print @arr,"\n",$var2,"\n"; # 返回567和8 pop @arr; # 直接丢弃弹出的元素 print @arr,"\n"; # 返回56
倒数第二行的pop @arr
没有作任何赋值,perl中有不少这种用法,当有返回内容时,却不对其赋值,表示仅执行操做,但丢弃操做后的返回结果,在perl中,这种称为"空上下文"(void context)。因此,这里能够表示直接删除数组的最后一个元素。
@arr=(5,6); push(@arr,0); # @arr如今是(5,6,0) push @arr,1..10; # @arr如今有13个元素:5,6,0,1,2,3,4,5,6,7,8,9,10 @other=qw{1 3 4 5}; push @arr,@other; # @arr如今17个元素:5,6,0,1,2,3,4,5,6,7,8,9,10,1,3,4,5
push和pop是操做数组尾部,shift和unshift则是操做数组头部:
- shift弹出(移除并返回)数组的第一个元素(最左边),当没有元素可弹时,shift将返回undef;
- unshift向数组最左边插入一个元素。
@arr = qw{perl python shell}; $m = shift(@arr); # $m变成"perl",@arr如今是("python","shell") $n = shift @arr; # $n变成"python",@arr如今是("shell") shift @arr; # @arr变成空了 %i = shift @arr; # $i为undef,@arr仍是空 unshift @arr,5; # @arr如今是(5) unshift @arr,4; # @arr如今是(4,5) @other=1..3; unshift @arr,@other; # @arr如今变为(1,2,3,4,5)
shift-unshift和pop-push操做的是数组首尾部。若是想要操做数组的中间某个元素,则须要使用splice()函数。
splice()函数有4个参数,后两个参数可选。
若是只给两个参数,则从索引位置开始,一直删除到数组结尾。
# 两个参数 @arr = qw{perl python shell php java}; @arr1 = splice @arr,2; # @arr如今是qw{perl python} # @arr1如今是qw{shell php java} # 三个参数 @arr = qw{perl python shell php java}; @arr1 = splice @arr,2,2; # @arr如今是qw{perl python java} # @arr1如今是qw{shell php} # 四个参数 @arr = qw{perl python shell php java}; @arr1 = splice @arr,2,2,qw{ruby}; # @arr如今是qw{perl python ruby java} # @arr1如今是qw{shell php}
在使用四个参数的时候,若是将第三个参数设置为0,则能够不用作任何删除就向数组中插入新元素。
@arr = qw{perl python shell php java}; @arr1 = splice @arr,2,0,qw{ruby}; # @arr如今是qw{perl python ruby shell php java} # @arr1如今是qw()
foreach能够遍历列表或数组。
foreach $subject qw(perl python shell){ print $subject,"\n"; }
其中$subject是控制变量,每一个迭代过程当中,都会从列表或数组中取出一个元素赋值给控制变量。
迭代数组:
@arr=qw(perl python shell); foreach $subject (@arr){ print $subject,"\n"; }
迭代过程当中,赋值给控制变量的实际上是列表或数组中的引用,并不是是直接取出元素的值赋值给控制变量的(也就是说,不是变量复制)。所以,在foreach过程当中修改控制变量的值也会修改列表/数组中元素的值。
@arr=qw(perl python shell); foreach $subject (@arr) { $subject .= "aaa"; } print @arr; # 输出perlaaapythonaaashellaaa
当foreach遍历结束后,控制变量将复原为foreach遍历前的值(例如未定义的是undef)。
$subject="php"; foreach $subject (qw(perl python shell)){ } print $subject; # 输出"php"
$_
在foreach遍历结构中也能够省略控制变量部分,这时会使用默认的变量$_
做为控制变量,每次迭代都会从数组中取出一个列表/数组的索引赋值给$_
。
foreach (qw(perl python shell)) { print $_,"\n"; }
其实,perl中不少地方没有"需求数据"时,都会自动使用$_
。例以下面的print函数就使用了$_
。
$_="hello world!\n"; print;
数字<大写字母<小写字母
。在之后,还能够自定义排序规则。print reverse 11,6..8,20,"\n"; # 输出顺序:20 8 7 6 11 @arr=qw(perl python shell); reverse @arr; # 反转了顺序,但返回结果丢弃了,@arr不变 print @arr,"\n"; # 返回顺序:perl python shell @arr1=reverse @arr; # @arr1中元素的顺序:shell python perl print '@arr1: ',@arr1,"\n"; @sort_arr=sort @arr; # 排序,但由于@arr中元素顺序本就是升序的 print '@sort_arr: ',@sort_arr,"\n"; # 返回顺序:perl python shell sort @arr; # 虽排序,但丢弃了排序结果
each操做符能够获取一个键值对(key/value)。能够操做数组,也能够操做hash。each操做hash的内容见后文。
each对数组操做时,返回的是数组中元素的索引号和该元素的值。
my @arr=qw(perl python shell); while (my($index,$value) = each(@arr)){ print "$index: $value","\n"; }
其中my关键字表示该变量是局部变量。如下是执行结果:
0: perl 1: python 2: shell
若是不使用each,则须要遍历数组,并获取数组的索引以及元素的值。
@arr=qw(perl python shell); foreach $index (0..$#{arr}) { print "$index: $arr[$index]","\n"; }