列表与数组

遗落在树梢的风筝 / 2023-08-20 / 原文

目录
  • 数组
  • 列表
    • ..范围操作符
    • qw简写
    • 列表的赋值
    • @字符
  • pop和push操作符
  • shift和unshift

列表指的是标量的有序集合,而数组则是存储列表的变量

数组

  1. 假如你对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大——只要有可用的内存分配给Perl,数组的长度是没有上限的。如果在扩展过程中需要创建增补元素,那么它们的默认取值为undef:
$rocks[0] = 'bedrock';             #一个元素
$rocks[1] = 'slate';               #又一个
$rocks[2] = 'lava';                #再来一个
$rocks[3] = 'crushed rock';        #再来一个
$rocks[99] = 'schist';             #现在有95个undef元素
  1. 数组的最后一个元素的索引值是$#name,这个数字比数组元素的个数少1,因为还有一个编号为0的元素:
    • $rocks[$#rocks] = 'hard rock';
    • $rocks[-1] = 'hard rock';
      假如你在数组中有3个元素,则有效的负数索引值为-1(最后一个元素)、-2(中间的元素)、-3(第一个元素)。实践中,似乎没有人会使用-1以外的负数索引值

列表

  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 );
两种写法等价

  1. qw表示"quoted word(加上引号的单词)"或"quated by whitespace(用空白圈引)"
  2. Perl会将其当成单引号内的字符串来处理(所以,在qw构建的列表中,不能像双引号内的字符串一样使用\n或$fred)。
  3. 除了以一对圆括号作为界定符,Perl还允许用任何标点符号作为界定符

列表的赋值

  1. 就像标量值可被赋值给变量一样,列表值也可被赋值给变量:
    ($fred,$barney,$dino) = ("flintstone","rubble","undef");
    左侧列表中的三个变量会依次被赋予右侧列表中对应的值,相当于分别做了三次独立的赋值操作。
  2. Perl中互换两个变量的值
    • ($fred,$barney) = ($barney,$fred);
    • ($betty[0],$betty[1]) = ($betty[1],$betty[0]);

@字符

  1. 构建一个字符串数组
($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)
  1. 数组名会被展开成(它所拥有的)元素列表,因为数组只能包含标量,不能包含其他数组,所以数组无法成为列表中的元素
  2. 要留意的是:将某个数组复制到另一个数组时,仍然算是列表的赋值运算,只不过这些列表是存储在数组里而已
    @copy = @quarry; #将一个数组中的列表复制到另一个数组

pop和push操作符

  1. pop操作符负责取出数组中最后一个元素并将其作为返回值返回
    • @array = 5..9;
    • $fred = pop(@array);
    • $barney = pop @array;
    • pop(@array);
      pop后面加不加括号都可以。Perl惯例:只要不会因为拿掉括号而改变原意,括号就是可以省略的
  2. push操作符
    • push(@array,0);
    • push @array,8;
    • push @array,1..10;
  3. push的第一个参数或者pop的唯一参数都必须是要操作的数组变量——对列表直接量进行压入(push)或弹出(pop)操作是没有意义的

shift和unshift