找回密码
 注册
查看: 2399|回复: 0

perl语言中的列表赋值

[复制链接]
发表于 2011-11-13 10:10:24 | 显示全部楼层 |阅读模式
和标量值类似,列表值也可以赋给变量:
($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);
左边列表中的每一个变量都得到了一个新值,和利用3 个赋值语句得到的结果是一样的。由于列表在赋值之前已经建立,
因此在Perl 中可以使用如下的简单方法交换两个变量的值◆:
◆和C 语言不同,在C 语言中没有完成此类操作的简单方法。C 程序员通常需要使用临时变量,可能是使用宏(macro)来定义的。
($fred, $barney) = ($barney, $fred) #交换两个变量
($betty[0],$betty[1]) = ($betty[1],$betty[0]);
如果变量个数(等号左边)不同于其值的个数(等号右边),将发生什么事情呢?在列表赋值中,额外的值会被自动忽略。
因为Perl 认为,如果需要把值存起来,那应当指明其存储的地方。同样,如果有多余的变量,额外的变量被赋予undef◆。
◆对于标量变量这是对的。对于数组变量将得到空的列表,在后面将看到。
($fred, $barney) = qw <flintstone rubble slate granite>; #两个值被忽略了
($wilma,$dino) = qw[flintstone]; #$dino 为undef
现在可以给列表赋值了,可以使用如下的一行代码来创建按一个字符串数组◆:
◆我们假设rocks 在本语句之前是空的。如果之前的$rocks[7]非空。那,这个赋值语句将不会改变其值。
($rocks[0],$rocks[1],$rocks[2],$rocks[3]) = qw/talc mica feldspar quartz/;
当想引用这个数组时,Perl 有一种简单的写法。在数组名前加@(后没有中括号)来引用整个数组。你可以把他读作“all of the
(所有的)”,所以@rocks 可以读作“all of the rocks(所有的石头)”◆。其在赋值运算符左右均有效:
◆Larry 声称选择美元符号($)和@符号的原因是,可以分别读做$calar(scalar)和@arry(array)。你如果不能按这种方式来记忆,也无所谓。
@rocks = qw / bedrock slate lava /;
@tiny = (); #空表
@giant = 1..1e5; #包含100,000 个元素的表
@stuff = (@giant, undef, @giant); #包含200,001 个元素的表
@dino = “granite”;
@quarry = (@rocks, “crushed rock”, @tiny, $dino);
最后一个赋值语句将五个元素(bedrock, slate, lava, crushed, rock, granite)赋给变量@quarry,因为@tiny 没有元素。(特别的
是,它没有undef 这个值,但可以像@stuff 那样明确的指定它。)还有一点需要注意的是数组名字被其列表值替换。数组不
能成为列表的一个元素的原因是数组只能包含标量值,不能包含其它的数组◆。没有赋值的数组变量的值为( ),空表。和
未初始化的标量变量为undef 类似,未被初始化的数组为空表。
◆但在Alpaca 书中,将介绍一类特殊的变量:引用。通过它可以造出被称为“lists of lists”(列表的列表)的数据结构,还有一些别的有用或
者有趣的结构。即便是那种情况,也不是将一个列表存放在一个列表之中,事实上存放的是其引用。
当将一个数组拷贝到另一个数组时,仍然是列表赋值。如下例:
@copy = @quarry; #将一个数组中的值拷贝的另一个数组中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 20:37 , Processed in 0.021460 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表