Perl 简明教程
Perl - Arrays
数组是存储标量值的已排序列表的变量。数组变量前面有“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 中,列表和数组术语经常被用来表示它们是可以互换的。但是列表是数据,数组是变量。
Array Creation
数组变量之前带有 @ 符号,并且使用括号或 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';
Accessing Array Elements
从数组中访问单个元素时,您必须在变量名前加上美元符号 ($),然后在变量名后方括号内追加元素索引。例如 -
#!/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 开始,因此若要访问第一个元素,您需要给 0 作为索引。您还可以给出一个负索引,在这种情况下,您从数组的末尾而不是开头选择元素。这意味着以下内容 -
print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon
Sequential Number Arrays
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
这里双点 (..) 被称为 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
Array Size
可以使用数组上的标量上下文来确定数组的大小 - 返回值将是数组中的元素数 -
@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
包含信息的数组中仅有四个元素,但数组长 51 个元素,最高索引为 50。
Adding and Removing Elements in Array
Perl 提供了许多有用的函数来添加和移除数组中的元素。你可能有一个疑问,什么是函数?到目前为止,你已经使用 print 函数来打印各种值。与此类似,还有许多其他的函数或有时称为子例程,这些函数可用于各种其他功能。
Sr.No. |
Types & Description |
1 |
push @ARRAY, LIST 将列表值推送到数组末尾。 |
2 |
pop @ARRAY 弹出并返回数组的最后一个值。 |
3 |
shift @ARRAY 将数组的第一个值移出并返回,将数组缩短 1 并向下移动所有内容。 |
4 |
unshift @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
Slicing Array Elements
你还可以从数组中提取“切片”,即,你可以从数组中选择多个项目以生成另一个数组。
#!/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
Replacing Array Elements
现在,我们将引入另一个称为 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。
Transform Strings to Arrays
让我们再来看一个名为 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
Transform Arrays to Strings
我们可以使用 join() 函数重新连接数组元素并形成一个较长的标量字符串。此函数具有以下语法 −
join EXPR, LIST
此函数以用 EXPR 值分隔的字段,将 LIST 的各个字符串连接成一个字符串,并返回该字符串。下面是示例 −
#!/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
Sorting Arrays
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 数值进行的。因此,最佳选项是先将数组的每个元素转换为小写字母,然后再执行排序函数。
The $[ Special Variable
到目前为止,您已经看到了我们在程序中定义的简单变量,并用它们来存储和打印标量和数组值。Perl 提供了许多特殊变量,这些变量有其预定义的含义。
我们有一个特殊变量,它写为 $[ 。此特殊变量是一个标量,包含所有数组的第一个索引。由于 Perl 数组采用从 0 开始的索引,因此 $[ 几乎总是 0。但是,如果您将 $[ 设置为 1,则所有数组都将使用从 1 开始的索引。建议不要使用除 0 之外的任何其他索引。不过,我们举一个例子来说明 $[ 变量的使用 −
#!/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
Merging Arrays
因为数组只是一个用逗号分隔的值序列,所以你可以像下面这样将它们组合在一起 −
#!/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
Selecting Elements from Lists
列表符号与数组的符号相同。您可以通过向列表后追加方括号并指定一个或多个索引来从数组中提取元素−
#!/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