开篇:如果说perl世界里,标量指的是单数的话,那么复数指的就是列表和数组。

列表指的是标量的有序集合;
数组则指的是存储列表的变量;
无论列表还是数组都可以包含无数多个元素。

一)访问数组中的元素 

1) 访问数组中的元素 
例如:
[root@localhost fuxi]# cat a1.pl 
#!/usr/bin/perl
#a1
$fred[0] = "yabba";        #将值yabba赋值给数组$fred的第零个元素$fred[0] ;
$fred[1] = "dabba";
$fred[2] = "doo";
foreach(0..2) {
print "$fred[$_]\n";
}
[root@localhost fuxi]# perl a1.pl 
yabba
dabba
doo

$number = 2.7881;
print $fred[$number - 1];     #结果和print $fred[1]相同。

$blank = $fred[ 142_857 ];    #未使用的数组元素,会得到 undef 的结果
$blanc = $mel;                        #未使用的标量 $mel, 也会得到 undef 的结果。

2、特殊的数组索引值

例如:

$num = @fred;        #数组@fred中元素的个数为$num个,取数组中元素的总个数!!!

$rocks[0] = 'bedrock';            #第一个元素
$rocks[1] = 'slate';                    #第二个元素
$rocks[2] = 'lava';                    #第三个元素
$rocks[3] = 'crushed rock';    #第四个元素
$rocks[99] = 'schist';                #第一百个元素,现在中间有95个 undef 元素
$#rocks            #  表示数组中最后一个元素的索引值:99
$rocks[-1]        # -1表示数组中的最后一个元素;
$rocks[-2]         # -2表示中间的元素;
$rocks[-3]        # -3表示第一个元素;  

3、列表直接量

在圆括号中用逗号隔开的一系列值。
例如:
(1, 2, 3)
(1, 2, 3,)            #相同的三个数字(末尾的逗号会被忽略)
("fred", 4.5)
(1..100)        #100个整数构成的列表
( )            #空列表;零个元素
(1..5) 
(1.7..5.9)
(0, 2..6, 10, 12)        #与(0, 2, 3, 4, 5, 6, 10, 12)相等
("zhangsan", "lisi", "wangwu", "zhaoliu")

4、qw简写

qw(zhangsan lisi wangwu zhaoliu)
qw!zhangsan lisi wangwu zhaoliu!
qw/zhangsan lisi wangwu zhaoliu/
qw"zhangsan lisi wangwu zhaoliu"
qw#zhangsan lisi wangwu zhaoliu#
qw$zhangsan lisi wangwu zhaoliu$
qw%zhangsan lisi wangwu zhaoliu%

注意:不管怎么说,对于qw引起来的内容,Perl都会将其当成单引号内的字符串来处理(所以,在qw构建的列表中,不能像双引号一样使用\n或$fred).其中的空白符会被抛弃。和单引号内的字符串一样,两个连续的反斜线,表示一个真实的反斜线

5、列表的赋值

($fred, $barney, $dino) = ("flintstone", "rubble", undef )
($betty[0], $betty[1]) = ($betty[1], $betty[0]);        #互换两者的值
($fred, $barney) = qw;    #忽略掉末尾两个元素
($wilma, $dino) = qw[flintstone];    # $dino被设为undef

@rocks = qw/ bedrock slate lava/;
@tiny = ( );
@giant = 1..1e5;
@stuff = (@giant, undef, @gaint);
$dino = "granite";
@quarry = (@rocks, "crushed rock", @tiny, $dino);

@copy = @quarry;     #将数组@quarry复制给@copy

6、pop、push、shift和unshift对比总结

[root@localhost fuxi]# cat a2.pl 
#!/usr/bin/perl
#本程序演示pop , push, shift, unshift的功能
print "The first, show pop function.\n";
my @array = 1..5;
print "The origin \@arry contains : @array\n";
my $a=1;
while (@array) {
print "$a --> @array \n";
 pop @array;
$a += 1;
}
print "------------------------------------- \n";
print "The second, show push function.\n";
my @array1 = undef;
print "The origin \@array1 contains : @array1\n";
my $b=1;
while ($b <= 5) {
 push @array1, "$b";
print "$b --> @array1 \n";
$b += 1;
}
print "------------------------------------- \n";
print "The third, show shift function.\n";
my @array2 = 1..5;
print "The origin \@array2 contains : @array2\n";
my $c=1;
while (@array2) {
print "$c --> @array2 \n";
 shift @array2;
$c +=1;
}
print "------------------------------------- \n";
print "The fourth, show unshift function.\n";
my $d=1;
my @array3 = undef;
while ($d <= 5) {
 unshift @array3, "$d";
print "$d --> @array3 \n";
$d += 1;
}
[root@localhost fuxi]# perl a2.pl 
The first, show pop function.
The origin @arry contains : 1 2 3 4 5
1 --> 1 2 3 4 5 
2 --> 1 2 3 4 
3 --> 1 2 3 
4 --> 1 2 
5 --> 1 
------------------------------------- 
The second, show push function.
The origin @array1 contains : 
1 -->  1 
2 -->  1 2 
3 -->  1 2 3 
4 -->  1 2 3 4 
5 -->  1 2 3 4 5 
------------------------------------- 
The third, show shift function.
The origin @array2 contains : 1 2 3 4 5
1 --> 1 2 3 4 5 
2 --> 2 3 4 5 
3 --> 3 4 5 
4 --> 4 5 
5 --> 5 
------------------------------------- 
The fourth, show unshift function.
1 --> 1  
2 --> 2 1  
3 --> 3 2 1  
4 --> 4 3 2 1  
5 --> 5 4 3 2 1

8、splice操作符


9、字符串中的数组内插

@rocks  = qw( bedstone redstone greenstone yellowstone whitestone);
print "The stones are : @rocks \n";        #数组内插后,各个元素会以空格隔开,但是首尾元素前后不会加空格,需要的话                                   可以自行添加。

@fred = qw(hello dolly);
$y = 2;
$x = "This is $fred[1]'s place";            #
$x = "This is $fred[$y -1]'s place";     #打印结果同上

@fred = qw(eating rcks is wrong);
$fred = "right";        #接下来我想打印出"this is right[3]"
print "this is $fred[3]\n";   # 用到了 $fred[3], 打印 "wrong"
print "this is ${fred}[3]\n";     # 打印 "right" (用花括号避开误解)
print "this is $fred"."[3]\n";       #还是打印 "right" (用分开的字符串避开误解)
print "this is $fred\[3]\n";    #还是打印"right" (用反斜线避开误解)

10、foreach控制结构

foreach 控制变量 (数组或列表) {
        循环体执行语句; 
}

11、perl最喜欢用的默认变量: $_

例如:
foreach (1..10) {
    print "I can count to $_\n";  #如果你在循环开头位置未指定控制变量,那么perl会默认使用$_ 
}
或者

$_ = "123";
print ;         #这里会直接打印123

12、reverse操作符

reverse会读取数组的值,并按相反顺序赋值。
比如:
@fred = (1..5);
@fred_new = reverse @fred;
print "@fred_new\n";        #会打印出5 4 3 2 1
@aaa = reverse 1..5;        #同上

注意:reverse会返回次序相反的列表, 但它并不会修改传进来的参数。假如返回值无处可去,那么这种操作也就变得毫无意义:
reverse @fred;        #错误: 这不会修改 @fred
@fred = reverse @fred;        #这样才好

13、sort操作符

sort操作符,一般对列表(也可以是数组)元素排序,默认是按ASCII码排序即:(数字-->大写字母-->小写字母,标点符号随机到各处)。
相对@rocks数组内元素排序
sort @rocks;    #错误
@rocks = sort @rocks;     #这样是正确的。

14、each操作符


15、标量上下文与列表上下文


16、在标量上下文中使用产生列表的表达式
例如
@backwards = reverse qw / yabba dabba doo /;
#会变成 doo, dabba, yabba
$backwards = reverse qw/ yabba dabba doo /;
#会变成 oodabbadabbay

17、在列表上下文中使用产生标量的表达式

@betty = ( );    #清空一个数组的方法

18、强制指定标量上下文
偶尔在列表上下文的地方,你想要强制引入标量上下文,这可以使用伪函数scalar.
例如:
@rocks = qw( talc quartz jade obsidian );
print "How many rocks do you have? \n";
print "I have", @rocks, " rocks!\n";        #错误, 这会输出各种石头的名称
print "I have", scalar @rocks, " rocks!\n";   #对了,这就可以打印除石头的种数了。

19、列表上下文中的

@lines = ;    # 读入所有行
chomp(@lines);        # 去掉所有的换行符
chomp(@lines = );    #读入所有行, 换行符去除。