Perl读书笔记(2)

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。

 

 

Leave a Reply

Your email address will not be published.