-- Start
对于下面的 Perl 语句,等号左边的$name 被称为标量,等号右边的"尚波" 被称为字符串常量,它的意思是把字符串常量"尚波"赋给变量$name。
$name = "尚波";
对于下面的 Perl 语句,等号左边的@names 被称为数组,等号右边的被称为列表,它的意思是把列表中的值赋给数组@names。
@names = ("尚波","张三","李四");
列表
所谓列表是指用括号括起来的一系列的值。下面的例子演示如何定义和使用列表。
#!/usr/bin/perl ############################ 定义列表 (); # 空列表 (1,2,3); (1..100); # 包含数字 1 到 100 的列表 ('a'..'b'); # 可用于字符串 ("尚波","李四"); # 双引号 ('尚波','张三','李四'); # 单引号 qw(尚波 张三 李四); # 同上(单引号),qw 表示 quoted by whitespace qw/尚波 张三 李四/; # qw 的定界符可以是任何标点符号 ############################ 使用列表 ($name1,$name2,$name3) = ("尚波","李四"); # 把列表中的值依次赋给三个标量 ($name1,$name3,$name4) = ("尚波","李四"); # $name4 中的值将为 undef ($name1,$name2) = ("尚波","李四"); # 李四 将被忽略 ($name1,undef,"李四"); # 张三 将被忽略 ($name1,$name2) = ($name2,$name1); # 交换标量中的值 $name = ("尚波","李四"); # $name 中的值为李四,最右边的值 @names = ("尚波","李四"); # 把列表中的值赋给一个数组
数组
#!/usr/bin/perl ################################ 定义数组 @names; @names = (); # 同上 @student_names = ("小王","小李"); @names = ("小尚",@student_names); # 此时,数组 @names 中将有 "小尚","小王","小李" @names = @student_names; # 复制数组 ################################ 访问数组 @names = qw(小尚 小王 小李); $name = $names[0]; # 取出数组下标为 0 的元素,注意,此处是 $names[0],不是 @names[0] $name = $names[-1]; # 取出数组的最后一个元素,Perl 支持负下标,如: $names[-2],$names[-3] 等 $names[19] = "小张"; # 数组会自动增长到20个元素,未定义的为 undef ($name1,$name3) = @names; # 将数组中的值赋给左边的三个标量 $last_index = $#names; #数组 names 的最后一个元素的下标 $#names += 1; # 改变数组 names 的长度 @names = qw(小尚 小王 小李 小赵); @names_part = @names[2,3]; # @names_part 数组中的值为:小李,小赵 @names_part = @names[1..3]; # @names_part 数组中的值为:小王,小李,小赵 @names[2,3] = ("大s","小s"); # @names 数组中的值为:小尚,小王,大s,小s @names[0,1] = @names[1,0]; # 交换数组元素 @names[0,1] = @names[2,3]; # 交换数组元素 ################################ 打印数组 @names = qw(小尚 小王 小李); print @names; # 输出:小尚小王小李,注意没有空格哦 print "@names"; # 输出:小尚 小王 小李 print "wave0409\@163.com"; # 打印 Email 时要注意转义@,否则会被认为是数组 print "I am $names[0]"; ################################ 迭代数组 $name = "小赵"; @names = qw(小尚 小王 小李); foreach $name (@names) { $name = "你好".$name; # 改变 $name 的值,数组中的值也相应的改变 } print $name; # 循环结束后,$name 的值将会被恢复到循环开始时的值:小赵 ################################ 对数组操作的函数 @names = qw(小尚 小王 小李); $name = pop (@names); # pop 函数用来删除并返回数组中最后一个元素(小李被删除) push (@names,'小李'); # push 函数用来向数组的尾端添加一个或多个元素(小李被添加到数组的尾部) push (@names,@student_names); # 将数组 @student_names 添加到 @names 中 @names = qw(小尚 小王 小李); $name = shift (@names); # shift 函数用来删除并返回数组中第一个元素(小尚被删除) unshift (@names,'小尚'); # unshift 函数用来向数组的头部添加一个或多个元素(小尚被添加到数组的头部) unshift (@names,@student_names); # 将数组 @student_names 添加到 @names 中 @names = qw(小尚 小王 小李); $name = join("-",@names); # 将数组元素连接成字符串:小尚-小王-小李 @names = split(/-/,$name); # 分割字符串成数组:("小尚","小王","小李") @names = split(/-/,$name,2); # 分割字符串成数组,分割成2个元素:("小尚","小王-小李") @names = qw(小尚 小王 小李); @names = reverse (@names); # 反转数组:小李 小王 小尚 @strings = (1,3,10,12); @stringSort = sort (@strings); # 按默认方式(字母)排序数组 @numberSort = sort {$a<=>$b}(@strings); # 自定义方式(数字)排序数组 @numberSort = sort {"\L$a" cmp "\L$b"}(@strings); # 自定义方式(忽略大小写)排序数组 @names = qw(小尚 小王 小李); @names2 = qw(小s 大s); @names_new = splice(@names,@names2); # 对@names进行插入替换操作,跳过2个元素,用@names2替换0个元素(相当于插入):小尚 小王 小s 大s 小李 @names_new = splice(@names,1,@names2); # 跳过2个元素,用@names2替换1个元素:小尚 小王 小s 大s @names = qw(张三 李四 王五); @result = grep(/^张/,@names); # 搜索姓张的人名 @numbers = (1,3); @result = map($_+1,@numbers); # 对数组的每个元素进行加 1 操作
二维数组
#!/usr/bin/perl # 定义二维数组,它通常用来存储表格 $users = [["张三",20,"内蒙古"],["李四",21,"辽宁"],["王五",22,"北京"]]; # 定义三行三列的表格 # 访问二维数组 print "@{$users->[0]}\n"; # 打印第一行 print "@{$users->[0]}[0]\n"; # 打印第一行第一列 print "$users->[0][0]\n"; # 打印第一行第一列 # 迭代二维数组 foreach $row(@$users) { ($name,$age,$adress) = @$row; print "$name,$adress\n"; }
标量上下文与列表上下文
将数组用到不同的场合会表现不同的行为,如:将一个数组赋给另个数组和赋给一个标量会产生不同的结果,如下。
#!/usr/bin/perl ################################ 标量上下文与列表上下文 @names = qw(小尚 小王 小李); @names2 = @names; # 复制数组 $length = @names; # 返回数组的长度 ($name) = @names; # 返回数组的第一个元素:小尚 print "@names"; # 打印数组 print scalar @names; # 打印数组的长度,scalar 函数用来强制指定标量上下文
-- 更多参见:Perl 精萃
-- 声 明:转载请注明出处 -- Last Updated on 2012-06-24 -- Written by ShangBo on 2012-06-21 -- End