Perl - 数组
数组是一种存储有序标量值列表的变量。数组变量前面有一个“at”(@)符号。要引用数组的单个元素,需要使用美元符号($)加上变量名,后跟方括号中的元素索引。
以下是一个使用数组变量的简单示例 −
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "$ages[0] = $ages[0]\n";
print "$ages[1] = $ages[1]\n";
print "$ages[2] = $ages[2]\n";
print "$names[0] = $names[0]\n";
print "$names[1] = $names[1]\n";
print "$names[2] = $names[2]\n";
这里我们在 $ 符号前使用了转义符号(\),只是为了打印它。否则 Perl 会将其理解为变量并打印其值。执行后,将产生以下结果 −
$ages[0] = 25 $ages[1] = 30 $ages[2] = 40 $names[0] = John Paul $names[1] = Lisa $names[2] = Kumar
在 Perl 中,List 和 Array 术语经常被视为可互换。但 list 是数据,而 array 是变量。
数组创建
数组变量以 @ 符号开头,可以使用括号或 qw 操作符来填充。例如 −
@array = (1, 2, 'Hello'); @array = qw/This is an array/;
第二行使用了 qw// 操作符,它返回一个字符串列表,将分隔的字符串按空白字符分隔。在这个示例中,这会导致一个四元素数组;第一个元素是 'this',最后一个(第四个)是 'array'。这意味着您可以像下面这样使用多行 −
@days = qw/Monday Tuesday ... Sunday/;
您也可以通过逐个单独赋值来填充数组,如下所示 −
$array[0] = 'Monday'; ... $array[6] = 'Sunday';
访问数组元素
访问数组中的单个元素时,必须在变量前加上美元符号($),然后在变量名后用方括号附加元素索引。例如 −
#!/usr/bin/perl @days = qw/Mon Tue Wed Thu Fri Sat Sun/; print "$days[0]\n"; print "$days[1]\n"; print "$days[2]\n"; print "$days[6]\n"; print "$days[-1]\n"; print "$days[-7]\n";
这将产生以下结果 −
Mon Tue Wed Sun Sun Mon
数组索引从零开始,因此要访问第一个元素,需要给出 0 作为索引。您也可以给出负索引,在这种情况下,您会从数组的末尾而不是开头选择元素。这意味着以下内容 −
print $days[-1]; # 输出 Sun print $days[-7]; # 输出 Mon
顺序数字数组
Perl 为顺序数字和字母提供了一个快捷方式。例如,在计数到 100 时,而不是逐个输入每个元素,我们可以像下面这样操作 −
#!/usr/bin/perl @var_10 = (1..10); @var_20 = (10..20); @var_abc = (a..z); print "@var_10\n"; # 打印从 1 到 10 的数字 print "@var_20\n"; # 打印从 10 到 20 的数字 print "@var_abc\n"; # 打印从 a 到 z 的字母
这里双点号(..)被称为 range operator(范围操作符)。这将产生以下结果 −
1 2 3 4 5 6 7 8 9 10 10 11 12 13 14 15 16 17 18 19 20 a b c d e f g h i j k l m n o p q r s t u v w x y z
数组大小
可以使用数组上的 scalar 上下文来确定数组的大小 - 返回的值将是数组中元素的数量 −
@array = (1,2,3); print "Size: ",scalar @array,"\n";
返回的值始终是数组的物理大小,而不是有效元素的数量。你可以使用以下代码片段来演示这一点,以及 scalar @array 和 $#array 之间的区别 −
#!/usr/bin/perl @array = (1,2,3); $array[50] = 4; $size = @array; $max_index = $#array; print "Size: $size\n"; print "Max Index: $max_index\n";
这将产生以下结果 −
Size: 51 Max Index: 50
数组中只有四个元素包含信息,但数组的长度为 51,最高索引为 50。
数组中添加和移除元素
Perl 提供了许多有用的函数来在数组中添加和移除元素。你可能会有疑问什么是 function?到目前为止,你已经使用了 print function 来打印各种值。类似地,还有各种其他 functions 或有时称为子程序,可以用于各种其他功能。
| 序号 | 类型与描述 |
|---|---|
| 1 | push @ARRAY, LIST 将列表的值推入数组的末尾。 |
| 2 | pop @ARRAY 弹出并返回数组的最后一个值。 |
| 3 | shift @ARRAY 移出数组的第一个值并返回它,将数组缩短 1,并将所有元素向前移动。 |
| 4 | unshift @ARRAY, LIST 将列表添加到数组的前面,并返回新数组中的元素数量。 |
#!/usr/bin/perl
# 创建一个简单的数组
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins = @coins\n";
# 在数组末尾添加一个元素
push(@coins, "Penny");
print "2. \@coins = @coins\n";
# 在数组开头添加一个元素
unshift(@coins, "Dollar");
print "3. \@coins = @coins\n";
# 从数组末尾移除一个元素
pop(@coins);
print "4. \@coins = @coins\n";
# 从数组开头移除一个元素
shift(@coins);
print "5. \@coins = @coins\n";
这将产生以下结果 −
1. @coins = Quarter Dime Nickel 2. @coins = Quarter Dime Nickel Penny 3. @coins = Dollar Quarter Dime Nickel Penny 4. @coins = Dollar Quarter Dime Nickel 5. @coins = Quarter Dime Nickel
切片数组元素
你也可以从数组中提取一个“切片” - 也就是说,你可以从数组中选择多个项目来生成另一个数组。
#!/usr/bin/perl @days = qw/Mon Tue Wed Thu Fri Sat Sun/; @weekdays = @days[3,4,5]; print "@weekdays\n";
这将产生以下结果 −
Thu Fri Sat
切片的规范必须有一个有效索引列表,可以是正索引或负索引,每个索引用逗号分隔。为了速度,你也可以使用 .. 范围运算符 −
#!/usr/bin/perl @days = qw/Mon Tue Wed Thu Fri Sat Sun/; @weekdays = @days[3..5]; print "@weekdays\n";
这将产生以下结果 −
Thu Fri Sat
替换数组元素
现在我们将介绍另一个函数 splice(),其语法如下 −
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
此函数将移除 @ARRAY 中由 OFFSET 和 LENGTH 指定的元素,并用 LIST(如果指定)替换它们。最后,它返回从数组中移除的元素。以下是示例 −
#!/usr/bin/perl @nums = (1..20); print "Before - @nums\n"; splice(@nums, 5, 5, 21..25); print "After - @nums\n";
这将产生以下结果 −
Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
在这里,实际替换从第 6 个数字开始,此后从 6 到 10 的五个元素被数字 21、22、23、24 和 25 替换。
将字符串转换为数组
让我们来看另一个函数 split(),其语法如下 −
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
此函数将字符串拆分为字符串数组并返回。如果指定了 LIMIT,则最多拆分为该数量的字段。如果省略 PATTERN,则按空白字符拆分。以下是示例 −
#!/usr/bin/perl
# 定义字符串
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";
# 将上述字符串转换为数组。
@string = split('-', $var_string);
@names = split(',', $var_names);
print "$string[3]\n"; # 这将打印 Roses
print "$names[4]\n"; # 这将打印 Michael
这将产生以下结果 −
Roses Michael
将数组转换为字符串
我们可以使用 join() 函数将数组元素重新连接起来,形成一个长标量字符串。此函数的语法如下 −
join EXPR, LIST
此函数将 LIST 中的单独字符串连接成一个字符串,字段由 EXPR 的值分隔,并返回该字符串。以下是示例 −
#!/usr/bin/perl
# 定义字符串
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";
# 将上述字符串转换为数组。
@string = split('-', $var_string);
@names = split(',', $var_names);
$string1 = join( '-', @string );
$string2 = join( ',', @names );
print "$string1\n";
print "$string2\n";
这将产生以下结果 −
Rain-Drops-On-Roses-And-Whiskers-On-Kittens Larry,David,Roger,Ken,Michael,Tom
排序数组
sort() 函数根据 ASCII 数字标准对数组的每个元素进行排序。此函数的语法如下 −
sort [ SUBROUTINE ] LIST
此函数对 LIST 进行排序并返回排序后的数组值。如果指定了 SUBROUTINE,则在排序元素时应用 SUBROUTINE 中的指定逻辑。
#!/usr/bin/perl # 定义一个数组 @foods = qw(pizza steak chicken burgers); print "Before: @foods\n"; # 对此数组排序 @foods = sort(@foods); print "After: @foods\n";
这将产生以下结果 −
Before: pizza steak chicken burgers After: burgers chicken pizza steak
请注意,排序是基于单词的 ASCII 数字值进行的。因此,最好的方法是将数组的每个元素首先转换为小写字母,然后执行 sort 函数。
合并数组
因为数组只是用逗号分隔的值序列,所以你可以像下面所示那样将它们组合在一起 −
#!/usr/bin/perl @numbers = (1,3,(4,5,6)); print "numbers = @numbers\n";
这将产生以下结果 −
numbers = 1 3 4 5 6
嵌入的数组只是成为主数组的一部分,如下面所示 −
#!/usr/bin/perl @odd = (1,3,5); @even = (2, 4, 6); @numbers = (@odd, @even); print "numbers = @numbers\n";
这将产生以下结果 −
numbers = 1 3 5 2 4 6
从列表中选择元素
列表表示法与数组的表示法相同。你可以通过在列表后附加方括号并给出 一个或多个索引来从数组中提取元素 −
#!/usr/bin/perl $var = (5,4,3,2,1)[4]; print "value of var = $var\n"
这将产生以下结果 −
value of var = 1
同样,我们可以提取切片,虽然不需要前导的 @ 字符 −
#!/usr/bin/perl @list = (5,4,3,2,1)[1..3]; print "Value of list = @list\n";
这将产生以下结果 −
Value of list = 4 3 2