一、列表
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