Learning Perl 6th
Chapter 3 and Chapter 4
1、List是Scalar变量的有序集合,Array是List集合所对应的具体变量(List是数据,Array是对应的存储空间)。
2、与Python类似,Perl的List中变量可以是不同的Scalar元素。
3、Array的定义、下标访问如下:
#!/usr/bin/perl $a[0] = 1; $a[1] = "2"; $a[2] = 3; print $a[0], "\n"; print $a[1], "\n"; print $a[2], "\n";
4、当访问下标越界时候,会返回undef。
print "no\n" if $a[100] == undef;
5、当向越界下标赋值时,数组会自动拓展,中间未赋值的下标位置是undef:
#!/usr/bin/perl $a[0] = 1; $a[1] = "2"; $a[2] = 3; $a[10] = 10; foreach my $x (@a) { print $x, "\n"; }
中间被自动扩充的部分,用undef替换。
结果如下:
1 2 3 10
6、获取数组长度的3种方法:
(1)将数组变量存储到scalar变量中:
@words=qw(a b c d e f g); $num = @words; print $num;
(2)也可以强制使用scalar的context
@words=qw(a b c d e f g); print scalar @words;
(3)再或者,使用$#array,这个元素是数组最后一个元素的下标,它加1即为数组长度。
@words=qw(a b c d e f g); print $#words+1;
7、与Python类似,可以使用下标-1获取最后一个元素。
@words=qw(a b c d e f g); print $words[-1]; # would print g, or using the bellow same print @words[-1];
8、快捷操作符..定义区间数组
@arr=(1..10); # (1,2,3,4,5,6,7,8,9,10) print "@arr";
甚至可以混合使用,例如定义数组(1,2,3,7,11,12,13):
@arr=(1..3,7,11..13);
9、快捷方式qw,使用它,可以快速构造字符串的数组。
@arr = qw(a b cd e f g); print "@arr";
结果为:
a b cd e f g
10、数组的赋值:
首先,数组的常量形式为圆括号括起来的部分:
@arr=(1..3);
与其他语言类似,我们可以在等号左边直接将数组打散为数量相等的scalar变量。
my($a, $b, $c) = (1..3); print ($a+$b+$c); # is 6
在数组中嵌套数组,表示将数组打散,注入到新数组中:
@a1 = (1..3); @a2=(@a1,4,5); print "@a2"; # is (1,2,3,4,5)
11、数组之间的拷贝,注意拷贝是属于deep copy,即内存拷贝。不是只拷贝引用。
@a1 = (1..3); @a2=@a1; $a1[0] = -1; print "@a2"; # deep copy, so still (1,2,3)
12、如何向数组的最右端中插入元素,移除元素:
#插入 push @arr, $elem #弹出 $elem = pop @arr
一个例子如下:
@arr; foreach((1..9)) { push @arr, $_; } print "@arr"; # 1 2 3 4 5 6 7 8 9 while(my $e=pop(@arr)) { print $e; print " "; } # 9 8 7 6 5 4 3 2 1
13、上述的push、pop都是作用在数组最右端,如何操作最左端呢?
需要使用unshift(插入)和shift(弹出)。
@arr; foreach((1..9)) { unshift @arr, $_; } print "@arr"; print "\n"; # 9 8 7 6 5 4 3 2 1 while(my $e=(shift @arr)) { print $e; print " "; } # 1 2 3 4 5 6 7 8 9
14、上面的4个操作都是在数组头、尾进行,如何删除、添加数组中间的元素呢?
可以使用splice。