开篇:如果说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 = ); #读入所有行, 换行符去除。