Perl 简明教程

Perl - Arrays

数组是存储标量值的已排序列表的变量。数组变量前面有“at”(@) 符号。若要引用数组的单个元素,您需在变量名称后加上美元符号 ($),再跟上方括号中的元素索引。

An array is a variable that stores an ordered list of scalar values. Array variables are preceded by an "at" (@) sign. To refer to a single element of an array, you will use the dollar sign ($) with the variable name followed by the index of the element in square brackets.

以下是一个使用数组变量的简单示例 -

Here is a simple example of using the array variables −

#!/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 将将其理解为一个变量并将打印其值。执行时,这将产生以下结果 -

Here we have used the escape sign (\) before the $ sign just to print it. Other Perl will understand it as a variable and will print its value. When executed, this will produce the following result −

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

在 Perl 中,列表和数组术语经常被用来表示它们是可以互换的。但是列表是数据,数组是变量。

In Perl, List and Array terms are often used as if they’re interchangeable. But the list is the data, and the array is the variable.

Array Creation

数组变量之前带有 @ 符号,并且使用括号或 qw 运算符填充。例如 -

Array variables are prefixed with the @ sign and are populated using either parentheses or the qw operator. For example −

@array = (1, 2, 'Hello');
@array = qw/This is an array/;

第二行使用 qw// 运算符,它返回一个字符串列表,由空格分隔定界字符串。在此示例中,这会导致一个四元素数组;第一个元素是“this”,最后一个(第四个)是“array”。这意味着您可以按如下方式使用不同的行 -

The second line uses the qw// operator, which returns a list of strings, separating the delimited string by white space. In this example, this leads to a four-element array; the first element is 'this' and last (fourth) is 'array'. This means that you can use different lines as follows −

@days = qw/Monday
Tuesday
...
Sunday/;

您还可以在如下所示分别分配每个值来填充数组 -

You can also populate an array by assigning each value individually as follows −

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

Accessing Array Elements

从数组中访问单个元素时,您必须在变量名前加上美元符号 ($),然后在变量名后方括号内追加元素索引。例如 -

When accessing individual elements from an array, you must prefix the variable with a dollar sign ($) and then append the element index within the square brackets after the name of the variable. For example −

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

这会产生以下结果 −

This will produce the following result −

Mon
Tue
Wed
Sun
Sun
Mon

数组索引从 0 开始,因此若要访问第一个元素,您需要给 0 作为索引。您还可以给出一个负索引,在这种情况下,您从数组的末尾而不是开头选择元素。这意味着以下内容 -

Array indices start from zero, so to access the first element you need to give 0 as indices. You can also give a negative index, in which case you select the element from the end, rather than the beginning, of the array. This means the following −

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

Sequential Number Arrays

Perl 为顺序数字和字母提供了快捷方式。例如,与其在计数到 100 时键入每个元素,我们还可以执行如下所示的操作 -

Perl offers a shortcut for sequential numbers and letters. Rather than typing out each element when counting to 100 for example, we can do something like as follows −

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

这里双点 (..) 被称为 range operator 。这将产生以下结果 -

Here double dot (..) is called range operator. This will produce the following result −

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 Size

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

The size of an array can be determined using the scalar context on the array - the returned value will be the number of elements in the array −

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

返回的值始终是数组的物理大小,而不是有效元素的数量。您可以使用以下片段演示这一点,以及标量 @array 和 $#array 之间的差异 -

The value returned will always be the physical size of the array, not the number of valid elements. You can demonstrate this, and the difference between scalar @array and $#array, using this fragment is as follows −

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

这会产生以下结果 −

This will produce the following result −

Size: 51
Max Index: 50

包含信息的数组中仅有四个元素,但数组长 51 个元素,最高索引为 50。

There are only four elements in the array that contains information, but the array is 51 elements long, with a highest index of 50.

Adding and Removing Elements in Array

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

Perl provides a number of useful functions to add and remove elements in an array. You may have a question what is a function? So far you have used print function to print various values. Similarly there are various other functions or sometime called sub-routines, which can be used for various other functionalities.

Sr.No.

Types & Description

1

push @ARRAY, LIST Pushes the values of the list onto the end of the array.

2

pop @ARRAY Pops off and returns the last value of the array.

3

shift @ARRAY Shifts the first value of the array off and returns it, shortening the array by 1 and moving everything down.

4

unshift @ARRAY, LIST Prepends list to the front of the array, and returns the number of elements in the new array.

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

这会产生以下结果 −

This will produce the following result −

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

Slicing Array Elements

你还可以从数组中提取“切片”,即,你可以从数组中选择多个项目以生成另一个数组。

You can also extract a "slice" from an array - that is, you can select more than one item from an array in order to produce another array.

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";

这会产生以下结果 −

This will produce the following result −

Thu Fri Sat

切片的规范必须具有一个有效的索引列表,可以是正数,也可以是负数,每个索引由逗号分隔。为了加快速度,你还可以使用 .. 范围运算符 −

The specification for a slice must have a list of valid indices, either positive or negative, each separated by a comma. For speed, you can also use the .. range operator −

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";

这会产生以下结果 −

This will produce the following result −

Thu Fri Sat

Replacing Array Elements

现在,我们将引入另一个称为 splice() 的函数,其语法如下 −

Now we are going to introduce one more function called splice(), which has the following syntax −

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

此函数将移除 @ARRAY 中由 OFFSET 和 LENGTH 指定的元素,并在指定的情况下用 LIST 替换它们。最后,它返回从数组中移除的元素。下面是示例 −

This function will remove the elements of @ARRAY designated by OFFSET and LENGTH, and replaces them with LIST, if specified. Finally, it returns the elements removed from the array. Following is the example −

#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25);
print "After - @nums\n";

这会产生以下结果 −

This will produce the following result −

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。

Here, the actual replacement begins with the 6th number after that five elements are then replaced from 6 to 10 with the numbers 21, 22, 23, 24 and 25.

Transform Strings to Arrays

让我们再来看一个名为 split() 的函数,其语法如下 −

Let’s look into one more function called split(), which has the following syntax −

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

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

This function splits a string into an array of strings, and returns it. If LIMIT is specified, splits into at most that number of fields. If PATTERN is omitted, splits on whitespace. Following is the example −

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

这会产生以下结果 −

This will produce the following result −

Roses
Michael

Transform Arrays to Strings

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

We can use the join() function to rejoin the array elements and form one long scalar string. This function has the following syntax −

join EXPR, LIST

此函数以用 EXPR 值分隔的字段,将 LIST 的各个字符串连接成一个字符串,并返回该字符串。下面是示例 −

This function joins the separate strings of LIST into a single string with fields separated by the value of EXPR, and returns the string. Following is the example −

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

这会产生以下结果 −

This will produce the following result −

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

Sorting Arrays

sort() 函数根据 ASCII 数字标准对数组的每个元素进行排序。此函数具有以下语法 −

The sort() function sorts each element of an array according to the ASCII Numeric standards. This function has the following syntax −

sort [ SUBROUTINE ] LIST

此函数对 LIST 进行排序并返回已排序数组值。如果指定了 SUBROUTINE,则在排序元素时应用 SUBTROUTINE 中指定的逻辑。

This function sorts the LIST and returns the sorted array value. If SUBROUTINE is specified then specified logic inside the SUBTROUTINE is applied while sorting the elements.

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

这会产生以下结果 −

This will produce the following result −

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

请注意,排序是根据单词的 ASCII 数值进行的。因此,最佳选项是先将数组的每个元素转换为小写字母,然后再执行排序函数。

Please note that sorting is performed based on ASCII Numeric value of the words. So the best option is to first transform every element of the array into lowercase letters and then perform the sort function.

The $[ Special Variable

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

So far you have seen simple variable we defined in our programs and used them to store and print scalar and array values. Perl provides numerous special variables, which have their predefined meaning.

我们有一个特殊变量,它写为 $[ 。此特殊变量是一个标量,包含所有数组的第一个索引。由于 Perl 数组采用从 0 开始的索引,因此 $[ 几乎总是 0。但是,如果您将 $[ 设置为 1,则所有数组都将使用从 1 开始的索引。建议不要使用除 0 之外的任何其他索引。不过,我们举一个例子来说明 $[ 变量的使用 −

We have a special variable, which is written as $[. This special variable is a scalar containing the first index of all arrays. Because Perl arrays have zero-based indexing, $[ will almost always be 0. But if you set $[ to 1 then all your arrays will use on-based indexing. It is recommended not to use any other indexing other than zero. However, let’s take one example to show the usage of $[ variable −

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

这会产生以下结果 −

This will produce the following result −

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

Merging Arrays

因为数组只是一个用逗号分隔的值序列,所以你可以像下面这样将它们组合在一起 −

Because an array is just a comma-separated sequence of values, you can combine them together as shown below −

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

这会产生以下结果 −

This will produce the following result −

numbers = 1 3 4 5 6

嵌入式数组成为主数组的一部分,如下所示−

The embedded arrays just become a part of the main array as shown below −

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

这会产生以下结果 −

This will produce the following result −

numbers = 1 3 5 2 4 6

Selecting Elements from Lists

列表符号与数组的符号相同。您可以通过向列表后追加方括号并指定一个或多个索引来从数组中提取元素−

The list notation is identical to that for arrays. You can extract an element from an array by appending square brackets to the list and giving one or more indices −

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"

这会产生以下结果 −

This will produce the following result −

value of var = 1

类似地,我们可以提取切片,但不需要前导@字符−

Similarly, we can extract slices, although without the requirement for a leading @ character −

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";

这会产生以下结果 −

This will produce the following result −

Value of list = 4 3 2