第三章 列表和数组
1、 列表和数组在Perl中用来表示复数;
2、 列表(list)指的是标量的有序集合,数组(array)表示存储列表的变量;列表是数据,数组是变量,列表可以不放在数组中;
3、 数组或列表的每个元素都是单独的标量变量,拥有独立的变量值,可以同时包含数字、字符串或undef,但使用时一般让其具有相同的类型;
4、 索引计数从0开始,如果索引值是表达式,而结果不为整时会先取整,如果越界或未定义则值为undef;索引表达式不会进行变量替换,因此不能使用变量;对索引值超过数组尾端的元素进行赋值时,数组将会依需要自动扩大,如果中间有空出来的未赋值元素,则Perl自动为其赋值为undef;“$#数组名”可以取得最后一个数组元素的索引值,也可以负数对索引从后向前计数,最后个索引的值为-1;
5、 数组和标量属于不同的命名空间,因此可以同时使用同名的数组名和标量名,但不建议这么做;
6、 列表直接量是圆括号内的一串以逗号分隔的值,可以使用范围操作符表达式,如(1..20),也可以使用表达式以在每次用到时进行计算;使用qw可以表示“加上(单)引号的单词”,它会“把空白当引号”,不会对“/n”等进行转义,不能在其间进行注释,但可以在中间换行;
7、 赋值时,如果变量多于值,则会对尾部的变量赋予undef,如果值的个数多于变量,则多余的值会被丢弃;数组不能包含数组,除非使用“引用”;赋值前,数组变量的值是空列表;
8、 “@数组名”可以引用整个数组,读作“全部的…”,且此符号在赋值操作符两端均可使用;
9、 pop用来取出数组中最后一个元素并将它返回,格式为“pop (@数组名)”,括号可有可无,但参数必须是数组变量,不能是列表;push用来在数组末尾追加一个元素,格式为“push (@数组名,元素值)”,同样,push只能对数组进行操作;shift(取出)和unshift(添加)是用来在数组首部进行操作的函数;对于空数组,pop和shift的返回值均为undef;
10、 数组可以进行在双引号内进行数组替换,如果数组名后跟“[”这样的字符,必须将先将它们隔离,否则“[”会被当作数组索引的一部分;隔离方法可以使用如:${数组名}[1] 、“${数组名}”.“[1]”或“${数组名}/[1]”的形式;
11、 foreach循环的结构为“foreach 控制变量 (列表){ 循环体; }”,控制变量会遍历列表元素,且控制变量就列表元素而非其副本,因此,如果在循环中修改控制变量,那么修改的就是列表元素本身;而控制变量在使用结束后会被还原为原始值;控制变量可以省略,此时将使用$_;
12、 reverse函数会读取其后列表的元素(可以来自于数组)并以相反的顺序返回,但并不影响被读取数组的元素值;如果要将反向顺序的元素值存入自身,可以使用如@array = reverse @array的形式进行;
13、 sort函数会读取数组元素并将其按ASCII编码的顺序进行排序(不会按数字大小排序),排序结果不会影响数组本身,这类似于前面的reverse;
14、 所谓“上下文(context)”指的是表达式出现的位置。解析表达式时,Perl会希望它是“标量值”或“列表值”之一;
15、 数组在列表上下文会产生列表,在标量上下文会返回列表元素的个数;但在标量上下文中,sort返回undef(排序后取元素个数没有什么意义),reverse返回元素值反序的字符串;
16、 在列表上下文中使用产生标量的表达式时,如果表达式的求值结果是标量值,则其会被自动提升为仅含有单一元素的列表;scalar函数可以在列表上下文中强制指定使用标量上下文;
17、 <STDIN>在标量上下文中会返回输入数据的下一行,在列表上下文中会返回剩余的各行,每一行都将会成为列表中单独的元素;列表上下文中,如果输入源是键盘,需要使用“Ctrl+D”结束,在Windows中一般使用“Ctrl+Z”结束,