数据类型之列表与数组

来源:互联网 发布:淘宝助手5.0下载 编辑:程序博客网 时间:2024/05/19 02:17

-- 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 whitespaceqw/尚波 张三 李四/; # qw 的定界符可以是任何标点符号############################ 使用列表($name1, $name2, $name3) = ("尚波", "张三", "李四"); # 把列表中的值依次赋给三个标量($name1, $name2, $name3, $name4) = ("尚波", "张三", "李四"); # $name4 中的值将为 undef($name1, $name2) = ("尚波", "张三", "李四"); # 李四 将被忽略($name1, undef, $name2) = ("尚波", "张三", "李四"); # 张三 将被忽略($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, $name2, $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,2,3,10,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, 2, 0, @names2); # 对@names进行插入替换操作,跳过2个元素,用@names2替换0个元素(相当于插入):小尚 小王 小s 大s 小李@names_new = splice(@names, 2, 1, @names2); # 跳过2个元素,用@names2替换1个元素:小尚 小王 小s 大s@names = qw(张三 李四 王五);@result = grep(/^张/, @names); # 搜索姓张的人名@numbers = (1, 2, 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, $age, $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