Perl 语言中提供了数组变量, 用于标识一组元素的集合. Perl 的数组功能是非常强大的, 不仅可以作为数组,还可以做为栈或队列使用。
1. 数组特性
perl 数组元素类型可以是字符串, 也可以是数字perl 数组可以当做栈使用perl 数组可以当做队列使用perl 数组支持反向索引perl 数组可以不定义直接使用, 在使用的同时自动创建
2. 数组基本操作
2.1 创建数组
数组变量名: @+变量名, 如:@abooks, @studentsperl 数组可在定义的时候, 直接使用列表直接量赋值使用数组元素赋值时, 如果数组未定义,那么会自动创建一个新的全局数组.
创建方式示例
创建空数组@null = ();创建数字数组@ints = ( 1, 2, 3, 4); @ints = ( 1…4 );复制数组@ints2 = @ints;创建混合数组@array = (@ints, 1…3, $name );数组元素赋值$array[0]=“java”
2.2 数组引用
数组元素引用格式: $array[index], array 为数组名称, index 为索引号数组元素为单数, 用$符号引用; 数组本身为复数, 使用@引用.数组正向索引下标从0 开始, 0 表示从前向后第一个元素数组反向索引下标从-1 开始, 表示从后向前第一个元素
数组引用示例描述
元素引用$books[0], $books[1]引用数组中单一元素整体引用@books, @ints引用数组整体
2.3 数组元素提取
使用@符合可以提取数组中的多个元素组成新的数组或为标量批量赋值:
提取为数组: @array=@books[0,3];批量赋值: ($book0, $book3) = @books[0,3];
2.4. 字符串内插数组
字符串中可直接内插数组或数组元素, 这是perl 的一个非常方便的功能. 常在开发测试脚本过程中使用.
数组内插示例描述
内插元素“KaTeX parse error: Expected 'EOF', got '\[' at position 6: books\̲[̲0\]", "books[1]”和普通标量内插无异内插数组@books, @ints将所用元素依次用空格隔开,组成一个字符串
2.5 数组上下文
perl 的数组是非常智能的, 能够揣摩你的代码上下文, 给你不同的返回上下文是指,根据左侧变量类型,使用数组做不同的赋值.
数组上下文示例描述
数组上下文@array_1 = @array_name;等号左侧为数组, 因此此语句表示复制数组标量上下文$length = @array_name等号左侧为标量, 标量表示单数, 所以此表达式为获取数组长度哈希上下文%hash = @array_name等号左侧为哈希变量, 则表示将数组转换为哈希结构
3. 数组遍历
perl 语言中对数组的遍历方式很多, 使用起来及其方便.不同的遍历方式适用不同的场景, 笔者建议全部掌握这五种遍历方式
3.1 字符串内插法遍历
字符串内插法遍历是最简单的遍历方法, $# 表示数组的最大索引值, 为数组长度-1数组元素之间用空格隔开, 当数组元素本身就有空格时, 展示有有点问题了.通常只用于测试阶段对数组做简单输出, 方便快捷
@books = ("java", "mysql", "linux", "perl");
print "books--maxIdx: $#books, elements:@books\n";
3.2 foreach 单行遍历
使用foreach 和内置变量$_ 遍历, $_ 表示数组中的一个元素通常用于遍历输出, 数组元素转字符串等操作.
print "$_\n" foreach @books;
3.3 foreach-默认变量遍历
使用foreach + 内置变量方式遍历数组, 每次遍历中可做一些业务处理只能获取数组元素内容, 不能获取数组元素与索引的对应关系
foreach (@books){
print "$_\n";
}
3.4 for 循环遍历
普通的for 循环遍历, $# 表示获取到数组索引最大值能获取数组元素与索引的对应关系
for my $idx (0..$#books){
print "$idx --> $bookArray[$idx]\n";
}
3.5 while-each 列表遍历法
while-each 直接把索引值和数组元素组成一个key-value 的列表能获取数组元素与索引的对应关系
while(my ($idx, $val) = each
@bookArray){
print "$idx --> $val\n";
}
4. 综合示例
4.1 示例脚本
print "\n#################### 2.1 创建数组 ####################\n";
@null=();
print "null: @null \n";
@ints = ( 0, 1, 2, 3..8, 9);
print "ints: @ints \n";
@ints2 = @ints;
print "ints2: @ints2 \n";
@arrays = ( a
, b
, @ints, "java");
print "arrays:@arrays \n";
$ints[1] = "java";
print "ints: @ints \n";
print "\n#################### 2.2 数组引用 ####################\n";
$int0 = $ints[0];
print "int[0]:$ints[0]\n";
@ints3 = @ints;
print "ints3: @ints \n";
print "\n#################### 2.3 数组元素提取 ####################\n";
@int_3_7 = @ints[3, 7];
print "ints[3]-ints[7]: @int_3_7 \n";
print "\n#################### 2.4 字符串内插 ####################\n";
print "ints: @ints \n";
print "int[0]: $ints[0] \n";
print "\n#################### 2.5 数组上下文 ####################\n";
$length = @ints;
print "ints length: $length \n";
@ints4 = @ints;
print "ints4: @ints4 \n";
@chars = ( A
, 'a', B
, 'b', C
, 'c');
%char_hs = @chars;
@char_keys = keys
%char_hs;
@char_vals = values
%char_hs;
print "keys: @char_keys, values: @char_vals \n";
@ints = ( 0 ..9 );
print "\n#################### 3.1 字符串内插法遍历 ####################\n";
print "ints: @ints";
print "\n#################### 3.2 foreach 单行遍历 ####################\n";
print "$_\n" foreach @ints;
print "\n#################### 3.3 foreach 默认变量遍历 ####################\n";
foreach (@ints){
print "$_\n";
}
print "\n#################### 3.4 for 循环遍历 ####################\n";
for my $idx (0..$#ints){
print "ints[$idx]=$ints[$idx]\n";
}
print "\n#################### 3.5 while-each 列表遍历 ####################\n";
while(my ($idx, $val) = each
@ints ) {
print "ints[$idx]=$val \n";
}
4.2 示例输出
#################### 2.1 创建数组 ####################
null:
ints: 0 1 2 3 4 5 6 7 8 9
ints2: 0 1 2 3 4 5 6 7 8 9
arrays:a b 0 1 2 3 4 5 6 7 8 9 java
ints: 0 java 2 3 4 5 6 7 8 9
#################### 2.2 数组引用 ####################
int[0]:0
ints3: 0 java 2 3 4 5 6 7 8 9
#################### 2.3 数组元素提取 ####################
ints[3]-ints[7]: 3 7
#################### 2.4 字符串内插 ####################
ints: 0 java 2 3 4 5 6 7 8 9
int[0]: 0
#################### 2.5 数组上下文 ####################
ints length: 10
ints4: 0 java 2 3 4 5 6 7 8 9
keys: A B C, values: a b c
#################### 3.1 字符串内插法遍历 ####################
ints: 0 1 2 3 4 5 6 7 8 9
#################### 3.2 foreach 单行遍历 ####################
0
1
2
3
4
5
6
7
8
9
#################### 3.3 foreach 默认变量遍历 ####################
0
1
2
3
4
5
6
7
8
9
#################### 3.4 for 循环遍历 ####################
ints[0]=0
ints[1]=1
ints[2]=2
ints[3]=3
ints[4]=4
ints[5]=5
ints[6]=6
ints[7]=7
ints[8]=8
ints[9]=9
#################### 3.5 while-each 列表遍历 ####################
ints[0]=0
ints[1]=1
ints[2]=2
ints[3]=3
ints[4]=4
ints[5]=5
ints[6]=6
ints[7]=7
ints[8]=8
ints[9]=9