perl语言——列表、数组

1.数组\列表

如果perl语言中的标量是单数(singular),那么复数(plural)用列表或数组表示。

1.1 数组和列表

perl中,列表表示一组标量的有序集合。数组是用来保存列表的变量。但这两个术语常常混用。

1.2 数组变量@array、数组索引$array[i]

数组变量:用 @变量名来表示数组整体,比如 @array。

数组索引:用**$变量名[index]**来索引数组内元素,比如$array[0] = 1;.

注意这里用的是中括号【】

数组的命名空间和标量的命名空间完全分开,所以数组@array和变量$array的是不同对象,在程序中同时定义这两个对象是合理的。

1
2
3
$array[0] = 0;  #数组@array
$array[1] = 1;
$array = 10; #标量$array

数组的长度理论上来说无限的,比如 $array[10000] = 0;这样数组array的长度就是10001个。

1.3 特殊的数组索引值 $#数组名\负索引

$#数组名 表示数组最后一个元素的索引,它比数组个数小1,因为索引从0开始。

$#数组名+1 表示数组大小。

负索引:比如-1表示最后一个,-2倒数第二个…………

1
2
3
4
5
$rocks[0] = 0;
$rocks[1] = 1;
$rocks[100] = 100; # 这样数组一共有了101元素,中间的 那些是undef元素
print $rock[$#rock]; # 输出数组最后一个值
print $rock[-1]; #输出数组最后一个值

1.4 数组赋值qw//,列表直接量

除了上面的对数组的单个元素赋值,还可以用以下的方法

1
2
@array1 = (1,2,'a','b',"string");
@array2 = qw/1 2 a b string/;

用括号()标出来、中间用都好隔开的叫列表直接量,里面数字、字符可以混合

1
2
3
4
5
(1,2,3)
(1,2,3,) #与上一行相同,末尾的逗号被忽略
(1..5) # 表示(1,2,3,4,5)
(1.5..5.5) #也表示(1,2,3,4,5),其中小数部分被忽略
(0..$#array) #表示数组的所有索引值

qw//是用来建立单词列表的。其中的斜杠是定界符,可以换成!! ## () {} [] 这些都可以

1.5 列表给变量赋值

列表给变量赋值的时候按照顺序对应。

1
2
3
4
($var1,$var2,$var3) = ("wang","huang","liu");
($var1,$var2,$var3) = ("wang","huang"); #$var3 是undef
($var1,$var2) = ("wang","huang","liu"); # 忽略列表多余的元素”liu"
($array[0],$array[1]) = ($array[1],$array[0]);#交换列表元素

1.6 push\pop 在数组尾添加、删除元素

1
2
3
4
5
6
7
8
@arr = (1,2,3);
$fred1 = pop(@arr); #$fred1为3
$fred2 = pop @arr; #$fred2为2
@array = ();
push (@array,1);# @array为(1)
push @array,2..5;#(1,2,3,4,5)
@others = 6..10;
push @array,@other;#(1,2,3...10)

1.6 shift\unshift 从开头移除、添加元素

语法与上面相同

1
2
3
@arr = (1,2,3);
shift @arr;
unshift @arr,1;

1.7 splice 从数组中间移除某些元素

前面的都是从开头或结尾操作,splice可以从中间操作数组。

splice最多有四个元素,至少有前两个

  1. 数组对象

    1. 开始的索引位置。如果只有这两个,那么splice将索引及其以后的元素移除,
    2. 长度,移除多少个元素
    3. 替换的列表。移除了一些元素,可以再补上一些
1
2
3
4
5
@arr = 1..10;
splice @arr,5; #@arr为(1,2,3,4,5)
splice @arr,2,3; # @arr为(1,2)
@other = (1,1);
splice @arr,1,1,@other; # @arr为(1,1,1),不上@other的元素

1.8 reverse\sort

reverse以反序返回数组

sort 返回以字符编码顺序排序的结果,不会改变数组。

1.9 foreach 、默认$_变量

1
2
3
4
5
6
7
@arr = (1..10);
foreach $ele (@arr) {
print "$ele\n";
}
foreach (@arr) {
print "$_\n"; #默认存到$_中
}

1.10 标量上下文和列表上下文

同一个表达式出现再不同上下文中意义不同,比如数组@array,有时表示数组所存的列表,有时表示数组中元素个数。

一个表达式、变量或数组到底表示什么意思,其决定性因素的是操作符。,比如:

1
2
3
4
5
6
7
8
9
42 + something # 这里的something必须是标量
sort somethings #something必须是列表
@people = qw/dong wang sun/;
$nu = @people; #@people返回3,元素个数
@arr = @people; # @people表示列表

$fred = something; #标量上下文
($var,$var) = something; #列表上下文
($var) = something; #列表上下文

强制指定标量上下文,用scalar伪函数

1
2
3
@arr = qw/1 2 3/;
print '@arr',"have ",scalar @arr," elements\n";
# 输出 @arr have 3 elements


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!