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";
这里我们在$ sign之前使用了转义符号(\)来打印它。 其他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',last(第四个)是'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作为索引。 您还可以给出负索引,在这种情况下,您可以从数组的末尾而不是从头开始选择元素。 这意味着以下 -
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
这里双点(..)称为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 = (1,2,3);
print "Size: ",scalar @array,"\n";
返回的值将始终是数组的物理大小,而不是有效元素的数量。 您可以使用此片段演示这一点,以及标量@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提供了许多有用的函数来添加和删除数组中的元素。 您可能有一个问题是什么功能? 到目前为止,您已使用print功能打印各种值。 类似地,存在各种其他功能或有时称为子例程,其可用于各种其他功能。
Sr.No. | 类型和描述 |
---|---|
1 | push @ARRAY, LIST 将列表的值推送到数组的末尾。 |
2 | pop @ARRAY 弹出并返回数组的最后一个值。 |
3 | shift @ARRAY 将数组的第一个值移开并返回它,将数组缩短1并将所有内容向下移动。 |
4 | unshift @ARRAY, LIST Prepends列表到数组的前面,并返回新数组中的元素数。 |
#!/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个数字开始,然后用数字21,22,23,24和25将5个元素从6替换为10。
将字符串转换为数组
让我们再看一个名为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数值执行的。 因此,最好的选择是首先将数组的每个元素转换为小写字母,然后执行sort函数。
$ [特殊变量
到目前为止,您已经看到我们在程序中定义的简单变量,并使用它们来存储和打印标量和数组值。 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