列表赋值
和标量值类似,列表值也可以赋给变量:
($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 个元素的表