1. 列表(list)是指标量的有序集合,而数组(array)则是指存储列表的变量。这两个术语常常混用。不过更精确地说,列表指的是数据,而数组指的是变量。
2. 对数组@rocks而言,最后一个元素的索引值是:$#rocks. 这是数字比数组元素的个数少1,因为还有一个编号为0的元素。另外,注意负数索引值得用法,$rocks[-1]指的是数组@rocks的最后一个元素。
3. 对数组右边界进行操作:pop 和 push
对数组左边界进行操作:shift 和 unshift
希望添加和移除数组中间的某些元素:splice 可能splice看起来并不起眼,但在其他语言中,要实现相同的功能并不轻松。许多人为达到相同的目的,使用各种复杂的概念和技术,比如链表神马的,但这无疑把程序猿的时间浪费在低层次的数据处理上,既不合理也不高明。
4. reverse会返回次序相反的列表,但它并不会修改传进来的参数。加入返回值无处可去,那这种操作也就变得毫无意义: reverse @fred; #错误——这不会修改@fred的值
@fred = reverse @fred; #这才正确嘛
5. each操作符:从perl5.12版开始支持。每次对数组调用each,会返回数组中下一个元素所对应的两个值:该元素的索引以及该元素的值。
6. scalar:强制切入标量上下文。
7. <STDIN>在标量上下文中会返回输入数据的下一行;在列表上下文中,则会返回所有剩下的行,直到文件结尾为止。返回的每一行都会成为列表中的一个元素。
8. sub NAME {
my($m, $n) = @_;
... ...
... ...
} 几乎所有的子程序都会以类似的程序代码作为开头。当你看到这一行时就会知道,这个子程序具有两个标量参数。
9. 可以用state来声明变量,它会告诉Perl该变量属于当前子程序的私有变量,并且在多次调用这种子程序期间保留该变量的值。类似C语言中的static
10. while (<STDIN>) {
print "I saw $_";
}
从字面上讲,它的意思是:“读取一行标准输入,看它是不是为真(通常是)。若是真,就进入while循环,并在下次循环时忘记刚刚读入的那一行,进入下一行!”
类似的结构还可以这样写:
while (defined($line = <STDIN>)) {
print "I saw $line";
}
11. 如果在列表上下文中调用行输入操作符,它会返回一个列表,其中包含所有的输入内容,每个列表元素代表一行输入内容:
foreach (<STDIN>) {
print "I saw $_";
}
它和10的区别是:在while循环里,Perl会读取一行输入,把它存入某个变量并且执行循环的主体,接下来它会回头寻找其他的输入行。但是在foreach循环里,行输入操作符会在列表上下文中执行(因为foreach需要逐项处理列表内容)。为此,在循环能够开始前,它必须先将输入全部读进来。加入输入来自400MB大小的Web服务器日志文件,它们的差异会十分明显!因此最好的做法通常是尽量使用while循环的简写,让它每次处理一行。