列表
- ():空列表,当做条件判断时为false
- 两个非空列表示例:("Hello ", "world", "\n") (123, 456, 789)
- 同一列表中可以容纳不同类型的元素
- Perl中的列表只有一维。(3, 8, 5, 15)、((3, 8), (5, 15))和(3, (8, 5), 15)都等于(3, 8, 5, 15)
- qw//可以用来声明字符串数组:qw/hello world good bye/等于('hello', 'world', 'good', 'bye'). 这里有两个要点:1. 元素以空格分隔 2. 空格分隔开的字符串被当做单引号声明的字符串处理。同样可以用#、|、<>、[]、{}、()代替//
-
可以对整数定义区间:(1 .. 6)等价于(1, 2, 3, 4, 5, 6). 注意只能对整数定义。如果对小数定义则会导致整数截断:(1.4 .. 6.9)等价于(1, 2, 3, 4, 5, 6). 由于字符也是整数,因此形如('a'..'k')的写法也可以
- reverse()函数将列表反序,例如reverse (qw(The cat sat on the mat))等于qw(mat the on sat cat The)
-
list[index]用于取列表中的元素。下标从0开始。负的下标表示倒序下标,例如list[-1]指最后一个元素,而list[-2]指倒数第二个元素。
- (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[-2..1])等于(‘Nov’, ‘Dec’, ‘Jan’, ‘Feb’)
- 使用多个下标可以将列表切片:(19, 68, 47, 60, 53, 51, 58, 55, 47)[(4, 5, 6)]将得到(53, 51, 58)
- 也可写作(19, 68, 47, 60, 53, 51, 58, 55, 47)[4, 5, 6]
- 列表赋值:($mone, $mtwo) = (1, 3);等价于$mone=1;$mtwo=3;
- ($mone, $mtwo) = ($mtwo, $mone);
- 可以将多个下标和区间获取切片:(qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[0,3,7..11])
数组
- Perl中存有列表的变量称为数组,数组名以@开头,例如@array = (1,2,3);
- print函数接受的参数本质上就是一个列表,所以可以直接将数组打印出来:
@array = (4, 6, 3, 9, 12, 10);
print @array, "\n";
得到:46391210
而如果使用这种写法
print "@array\n";
得到自动按空格分隔好的列表:4 6 3 9 12 10
- 将列表强制转换为标量将会得到列表的长度(所含元素数)
- $scalar1 = @array1;
- 或使用scalar()函数:print scalar @array1;
- 向数组中添加元素:
my @array1 = (1, 2, 3);
my @array2;
@array2 = (@array1, 4, 5, 6);
@array2 = (3, 5, 7, 9);
@array2 = (1, @array2, 11);
- $#array获取array的最大下标,例如my @array = (2, 4, 6, 8);则$#array为3
-
可以用foreach遍历列表和数组foreach scalar_variable ( list_or_array ) {...} 其中scalar_variable为迭代器。迭代过程中,可以通过膝盖迭代器的值更新列表中的元素:my @array = (10, 20, 30, 40); foreach (@array) {$_ *=2;}执行后@array中每个元组增倍。上面给出的例子还说明如果不显式指定迭代器名字,则$_为迭代器
- foreach也具有和if类似的expression modifier用法:print "[$_]\n" foreach @a;
- push(@array, $scalar)将标量$scalar加到@array最后(等价于@array = (@array, $scalar)),push(@array1, @array2)则将@array2接到@array1后(等价于@array1 = (@array1, @array2))
- pop(@array)从@array中删去最后一个元素,并返回这个元素
- 与push类似,shift(@array, $scalar)等价于@array = ($scalar, @array);而shift(@array1, @array2)则等价于@array1 = (@array2, @array1)
- unshift(@array)从@array中删除第一个元素,并返回这个元素
-
sort(@array)将@array进行排序,默认排序方法是字母排序。而如果希望数值排序,则可以调用sort({comparator}, @array),并定义数值排序规则,例如:my @number = sort { $a <=> $b } @unsorted;为进行数值排序,而my @string = sort { $a cmp $b } @unsorted;为进行字母排序
-
exists(@array[index])如果存在元素@array[index]则为true,否则false
-
delete(@array[index])删除@array中下标为index的元素,注意:如果删除的不是数组中的最后一个元素,则该被删除元素位置仍保留(即数组的长度不变),该位置上为一未初始化值的变量。如果删除的是最后一个元素,则数组的长度将会减1.
第5章:哈希
- Perl里的哈希指的是哈希映射,即类似stl::hash_map、java.util.HashMap
- 哈希变量声明、初始化时以%开始,例如:
- %where = ("Gary" , "Dallas","Lucy" , "Exeter","Ian" , "Reading","Samantha" , "Portland");基于这种写法可以通过列表初始化哈希:@array = qw(Gary Dallas Lucy Exeter Ian Reading Samantha Portland);%where = @array;
- 也可以写作%where = (Gary => "Dallas",Lucy => "Exeter",Ian => "Reading",Samantha => "Portland");
- 但在使用时仍然以$开始,例如取值$where{Gary},$where{“Ian”}
- 通过复制运算可以修改哈希中保存的值,也可以添加新值:$where{$key}=$value如果$key已存在,则将$key对应的值更新为$value,否则将$key=>$value对加入哈希
- exists()可用于检查某个键在哈希中是否存在,如果存在为true否则false. 例如:exists $where{Gary}
- delete()可用于删除哈希中的值,例如delete $hash{$key}
- 将哈希转换为列表:按哈希中的key=>value对逐个列出,即(key1, value1, key2, value2 ...).
- 通过将哈希赋值给列表变量,可以将哈希列表化:my %hash=(....); my @list=%hash;
- 在print中使用哈希%hash也会被强转,因为print接受的是列表类型
- 将哈希转换为标量,将得到一个分数,分子是哈希表中已经使用的桶,分母是总共桶数my $scalar = %person;print "$scalar\n"; #输出3/8
- keys($hash)返回$hash中所有key的列表,values($hash)返回$hash中所有值的列表。注意既然为列表,那么values($hash)中可能存在重复值
- 可以用each()函数遍历哈希表中所有key=>value对。
my %where = (
Gary => "Dallas",
Lucy => "Exeter",
Ian => "Reading",
Samantha => "Portland"
);
my($k, $v);
while (($k, $v) = each %where) {
print "$k lives in $v\n";
}
注意由于($k, $v)的值是拷贝赋值,因此改变$k/$v并不能影响哈希中的值
|
请发表评论