目录
列表指的是标量的有序集合,而数组则是存储列表的变量
数组
- 假如你对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大——只要有可用的内存分配给Perl,数组的长度是没有上限的。如果在扩展过程中需要创建增补元素,那么它们的默认取值为undef:
$rocks[0] = 'bedrock'; #一个元素
$rocks[1] = 'slate'; #又一个
$rocks[2] = 'lava'; #再来一个
$rocks[3] = 'crushed rock'; #再来一个
$rocks[99] = 'schist'; #现在有95个undef元素
- 数组的最后一个元素的索引值是$#name,这个数字比数组元素的个数少1,因为还有一个编号为0的元素:
- $rocks[$#rocks] = 'hard rock';
- $rocks[-1] = 'hard rock';
假如你在数组中有3个元素,则有效的负数索引值为-1(最后一个元素)、-2(中间的元素)、-3(第一个元素)。实践中,似乎没有人会使用-1以外的负数索引值
列表
- 列表直接量,可以由圆括号内用逗号隔开的一串数据表示,而这些数据就称为列表元素。例如:
- (1,2,3) #包含1,2,3这三个数字的列表
- (1,2,3,) #末尾的逗号会被忽略
- ("fred",4.5) #两个元素,“fred"和4.5
- ( ) #空列表,0个元素
- (1..100) #100个整数构成的列表
..范围操作符
上例最后一行用到了..范围操作符,该操作符会从左边的数字计数到右边,每次加1,以产生一连串的数字。
(1..5) #与(1,2,3,4,5)相同
(1.7..5.7) #同上,但这两个数字都会被去掉小数部分
(5..1) #空列表,..只能向上计数
(0,2..6,10,12)
($m..$n) #范围由$m和$n当前的值来决定
qw简写
("fred","barney","betty","wilma","dino");
《 == 》qw( fred barney betty wilma dino );
两种写法等价
- qw表示"quoted word(加上引号的单词)"或"quated by whitespace(用空白圈引)"
- Perl会将其当成单引号内的字符串来处理(所以,在qw构建的列表中,不能像双引号内的字符串一样使用\n或$fred)。
- 除了以一对圆括号作为界定符,Perl还允许用任何标点符号作为界定符
列表的赋值
- 就像标量值可被赋值给变量一样,列表值也可被赋值给变量:
($fred,$barney,$dino) = ("flintstone","rubble","undef");
左侧列表中的三个变量会依次被赋予右侧列表中对应的值,相当于分别做了三次独立的赋值操作。 - Perl中互换两个变量的值
- ($fred,$barney) = ($barney,$fred);
- ($betty[0],$betty[1]) = ($betty[1],$betty[0]);
@字符
- 构建一个字符串数组
($rocks[0],$rocks[1],$rocks[2],$rocks[3]) = qw/talc mica feldspar quartz/;
当你希望引用整个数组时,Perl提供了一个简单的记法。之哟啊在数组名之前加上@字符(后面没有检索用的方括号)就可以了。这种写法在赋值操作符的两边都可以使用:
@rocks = qw/ bedrock slate lava /;
@tiny = ( ); #空列表,由于空列表里没有任何元素,也就不会有undef被赋值到列表中
@giant = 1..1e5; #包含100 000个元素的列表
@stuff = (@giant,undef,@giant); #包含200 001个元素的列表
@dino = "granite";
@quarry = (@rocks,"crushed rock",@tiny,$dino);
最后一行进行的赋值运算会将@quarry设成拥有5个元素的列表(bedrocl、slate、lava、crushed rock、granite)
- 数组名会被展开成(它所拥有的)元素列表,因为数组只能包含标量,不能包含其他数组,所以数组无法成为列表中的元素
- 要留意的是:将某个数组复制到另一个数组时,仍然算是列表的赋值运算,只不过这些列表是存储在数组里而已
@copy = @quarry; #将一个数组中的列表复制到另一个数组
pop和push操作符
- pop操作符负责取出数组中最后一个元素并将其作为返回值返回
- @array = 5..9;
- $fred = pop(@array);
- $barney = pop @array;
- pop(@array);
pop后面加不加括号都可以。Perl惯例:只要不会因为拿掉括号而改变原意,括号就是可以省略的
- push操作符
- push(@array,0);
- push @array,8;
- push @array,1..10;
- push的第一个参数或者pop的唯一参数都必须是要操作的数组变量——对列表直接量进行压入(push)或弹出(pop)操作是没有意义的。