一、列表
1、列表:标量的有序集合,列表中元素可以是任意标量。
例:
(3, 4, 5) #包含数值3、4、5的列表(3, 4, 5,) #同上,末尾逗号会被忽略('a', "b", 3.4) #字符和数字组合的列表 (1..3) #相当于(1, 2, 3) (1.3..3.6) #同上,小数部分会忽略掉(0, 2..5, 8) #相当于(0, 2, 3, 4, 5, 8)(3..1) #空列表,指向上计数( ) #空列表 ($x+$y, $y) #列表中元素也可以是表达式、变量($x..$y) #由$x和$y的值来决定(0, $#arr ) #数组arr的所有索引数字2、qw简写
在字符串列前表加qw来代替字符串中的引号,且列表中的元素用空白隔开,空白字符会被忽略例:
qw(a abc cd) #相当于('a', 'abc', 'cd')
qw(a abc
cd) #同上
用qw简写时,列表中的字符串当做单引号字符串处理,因此不能像双引号字符串一样使用/n和变量内插例:
qw(a abc cd /n) #不会回车换行
qw可以用除了()之外的任意限定符,但左右限定符必须成对出现例:
qw! hello word/! ! #相当于('hello', 'world!')
qw# hello word #
qw{ hello word }
qw< hello word >
qw[ hello word ]
3、列表赋值
($a, $b, $c) = (1, 2, 3) #将1、2、3分别赋值给$a, $b, $c ($a, $b) = ($b, $a) #互换a、b的值($a, $b) = qw(aa, bb, cc) #'aa'赋值给$a,'bb'赋值给$b,'cc'被忽略($a, $b) = qw(aa) #'aa'赋值给$a,$b被设为undef二、数组
1、数组:存储列表的变量,数组变量以@打头, 数组变量的初始值为空列表()
2、数组赋值
{$arr[0], $arr[1]} = qw/aa bb/ #将字符串aa,bb分别赋值给数组arr的第0个和第1个元素@arr = qw/aa bb/ #同上@em = ( ); @b = 1..3 #相当于@b = (1, 2, 3)@all = (@arr, @empty, 'cc') #相当于@all = ('aa', 'bb', 'cc'),数组中不能包含数组,因此@arr被展开。@em为空,所以此数组包含三个元素@arr = @all #相当于@arr=('aa', 'bb', 'cc')@all = @arr #相当于@all=('aa', 'bb'),将一个数组赋值给另一个数组时,被赋值的数组将会被完全覆盖3、数组索引
$a[0] = 'index' #数组下标从0开始 $a[1.7-1] #相当于$a[0] ,任何结果为数字的表达式都可以作为数组下表,下表只取结果的整数部分$a[$#a] #数组a最后一个元素$a[-1] #同上,-1表示数组最后一个元素索引,-2表示倒数第二个索引,依次类推三、操作函数
pop函数:删除数组中最后一个元素,同时返回该元素的值例:
@array = 1..3;
$t1 = pop (@array); #$t1= 2,@array = (1,2)
$t2 = pop @array; #pop后面可以不加括号,只要不会因为拿掉括号而改变原意,则括号可以省略
pop @array; #现在@array变为空
$t3 = pop @array; #因为@array为空,所以pop什么都不做
push函数:添加一个元素到数组末尾例:
push (@array, 1); #array = (1)
push @array, 2; #push后面可以不加括号,只要不会因为拿掉括号而改变原意,则括号可以省略
push @array, 3..5; #现在@array变为空(1, 2, 3, 4, 5)
push @other, 6..8;
push @array, @other;#因为@array变为空(1, 2, 3, 4, 5, 6, 7, 8)
shift函数:删除数组中第一个元素,同时返回该元素的值用法同pop函数
unshift函数:添加一个元素到数组开头
用法同push函数
reverse函数:将列表中的元素逆序排列并返回排序后的列表
例:
@arr = 6..10;
@temp = reverse @arr; #@arr变为(10, 9, 8, 7, 6)
@temp = reverse 6..10; #同上,@arr变为(10, 9, 8, 7, 6)
@arr = reverse @arr ; #@arr被倒序
reverse @arr #@arr没有被修改,因为返回值无处可去
sort函数:根据字符编码顺序对列表中的元素进行排序并返回排序后的列表例:
@arr = qw/c d b a/;
@temp = sort@arr; #@temp变为qw/a b c d/
@temp = reverse sort 6..10; #@temp变为qw/10 6 7 8 9/,将数字当成字符串来排序结果会不准确
@arr = reverse sort @arr ; #@arr变为qw/d c b a/,先按sort排序,再按reverse排序
sort @arr #@arr没有被修改,因为返回值无处可去
四、字符串中的数组内插
例:
@arr = qw{b c};
print "a @arr d"; #打印输出:a b c d
print "a $arr[1] d"; #打印输出:a c d
print "a $arr[2-1] d"; #同上
$temp = "right";
print "this is $arr/[1]"; #同上,用/区分
print "this is $arr"."[1]"; #同上用字符串连接符区分
print "this is $arr[1]"; #打印输出:this is c
print "this is ${arr}[1]"; #打印输出:this is right[1],用大括号区分数组元素和标量变量
五、foreach循环结构
foreach可逐项遍历列表中的值例:
foreach $rock (qw/a b c/) { print "rock is $rock./n"; #每次循环,控制变量$rock都会从列表中取得新值 }
输出结果:
rock is a.
rock is b.
rock is c.
可通过修改控制变量(即上例中的$rock)的值对列表元素进行修改,循环结束后控制变量的值恢复为循环前的值例:
@rocks = qw/a b c/;
$rock = "rock";
foreach $rock ( @rocks ) { $rock = "/t$rock"; #在@rocks的每个元素前加上跳格符
$rock .="/n"; #同时在@rocks末尾加上换行符
print "The rock is:$rock"; }
print "The rocks are:/n", @rocks;
print "Loop ends: the rock is $rock";
输出结果:
The rock is a
The rock is b
The rock is c
The rocks are: a b c
Loop ends:the rock is rock