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 中,列表和数组术语经常被使用,就好像它们可以互换一样。但列表是数据,数组是变量。

数组创建

数组变量以 @ 符号为前缀,并使用括号或 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]; # outputs Sun
print $days[-7]; # outputs Mon

序号数组

Perl 提供了连续数字和字母的快捷方式。例如,当数到 100 时,我们可以执行如下操作,而不是输入每个元素:

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z

这里双点(..)称为范围运算符。这将产生以下结果 -

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

数组大小

数组的大小可以使用数组上的标量上下文来确定 - 返回的值将是数组中元素的数量 -

@array = (1,2,3);
print "Size: ",scalar @array,"\n";

返回的值始终是数组的物理大小,而不是有效元素的数量。您可以使用此片段来演示这一点,以及标量 @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

数组中只有 4 个元素包含信息,但数组长度为 51 个元素,最高索引为 50。

添加和删​​除数组中的元素

Perl 提供了许多有用的函数来添加和删除数组中的元素。您可能有一个疑问,什么是函数?到目前为止,您已经使用print函数来打印各种值。类似地,还有各种其他功能或有时称为子例程,它们可用于各种其他功能。

先生。 类型和描述
1

推送@ARRAY,列表

将列表的值推到数组的末尾。

2

流行@ARRAY

弹出并返回数组的最后一个值。

3

移位@ARRAY

将数组的第一个值移开并返回它,将数组缩短 1 并将所有内容向下移动。

4

取消移动@ARRAY,列表

将 list 添加到数组的前面,并返回新数组中的元素数。

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
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 ] ]

此函数将删除由 OFFSET 和 LENGTH 指定的 @ARRAY 元素,并用 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 的 5 个元素替换为数字 21、22、23、24 和 25。

将字符串转换为数组

让我们看一下另一个名为split()的函数,它具有以下语法 -

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

该函数将字符串拆分为字符串数组并返回它。如果指定 LIMIT,则最多拆分为该数量的字段。如果省略 PATTERN,则按空格分割。以下是示例 -

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael

这将产生以下结果 -

Roses
Michael

将数组转换为字符串

我们可以使用join()函数重新连接数组元素并形成一个长标量字符串。该函数具有以下语法 -

join EXPR, LIST

该函数将 LIST 的各个字符串连接成一个字符串,其中字段由 EXPR 的值分隔,并返回该字符串。以下是示例 -

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@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,则在对元素进行排序时将应用 SUBTROUTINE 内的指定逻辑。

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";

这将产生以下结果 -

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

请注意,排序是根据单词的 ASCII 数字值进行的。所以最好的选择是首先将数组的每个元素转换为小写字母,然后执行排序功能。

$[ 特殊变量

到目前为止,您已经看到了我们在程序中定义的简单变量,并使用它们来存储和打印标量和数组值。Perl 提供了许多特殊变量,它们都有其预定义的含义。

我们有一个特殊的变量,写为$[。这个特殊变量是一个标量,包含所有数组的第一个索引。因为 Perl 数组具有从零开始的索引,所以 $[ 几乎总是 0。但是如果将 $[ 设置为 1,那么所有数组都将使用基于零的索引。建议不要使用除零以外的任何其他索引。然而,让我们举一个例子来展示 $[ 变量的用法 -

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \@foods[1]: $foods[1]\n";
print "Food at \@foods[2]: $foods[2]\n";

这将产生以下结果 -

Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

合并数组

因为数组只是一个以逗号分隔的值序列,所以您可以将它们组合在一起,如下所示 -

#!/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