数据类型之列表与数组

-- 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, $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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值