跳转到内容

Perl 编程/数组变量

来自维基教科书,开放世界中的开放书籍
上一个:标量变量 索引 下一个:哈希变量

Perl 语法同时包含列表和数组。

Perl 中的列表是标量值的排序集合。它在你的代码中表示为用逗号分隔的值序列,这些值可能包含在标量变量中,也可能不包含。列表可以用于同时进行多个赋值,并且可以作为参数传递给几个内置和用户定义的函数。

#!/usr/bin/perl
use strict;
use warnings;

my ($length, $width, $depth) = (10, 20, 15);

print "The values are: ", $length, $width, $depth;
注意
构建列表时,不需要括号。它们只用于优先级。

备用列表构建

[编辑 | 编辑源代码]

创建不包含空格的多个字符串的列表时,Perl 提供了一种快捷方式来避免键入多个引号和逗号。而不是

($name1, $name2, $name3, $name4) = ('Paul', 'Michael', 'Jessica', 'Megan');

你可以使用qw//运算符。此运算符使用任何非字母数字字符作为分隔符(通常是/字符),并包含以空格分隔的裸词序列。分隔符将命令与参数分隔开。上面的行与以下内容相同

($name1, $name2, $name3, $name4) = qw/Paul Michael Jessica Megan/;

两者都等于此

($name1, $name2, $name3, $name4) = qw(Paul Michael Jessica Megan);

最后一个示例使用打开和关闭圆括号作为不同的分隔符。如果你选择的 delimit 选择了打开和关闭版本,你都需要使用它们。否则只需重复相同的符号两次。例如,你不能键入qw<Paul Michael<你必须键入qw<Paul Michael>.

你也可以滥用 glob 语法,当字符串不包含 shell 元字符时

($name1, $name2, $name3, $name4) = <Paul Michael Jessica Megan>;
注意
qw// 运算符生成的字符串是单引号,这意味着集合中不会发生插值。如果你需要在列表中包含变量,则不能使用此方法。

列表赋值

[编辑 | 编辑源代码]

如上所示,列表可用于同时进行多个赋值。如果左侧变量的数量与右侧值的數量相同,则所有变量都将按预期分配给相应的值。

如果左侧变量少于右侧值,则“额外”值将被简单地忽略。

#!/usr/bin/perl

($length, $width) = (10, $w, 15);  #$length gets 10, $width gets the value of $w. 15 is ignored

如果左侧变量多于右侧值,则“额外”变量将分配默认值undef

#!/usr/bin/perl

($length, $width, $depth) = (10, $w); #$length gets 10, $width gets the value of $w. $depth is undef

列表赋值的存在可以创建“交换”两个变量的值的能力,而无需中间临时变量。

#!/usr/bin/perl

$foo = 10;

$bar = 5;

($foo, $bar) = ($bar, $foo);  #$foo now equals 5, while $bar equals 10;

Perl 中的数组是一个包含列表的变量。数组可以修改,添加和删除元素,清空或重新分配到一个完全不同的列表。就像所有标量变量都以$字符开头一样,所有数组变量都以@字符开头。

注意
在 Perl 中,经常错误地将“列表”和“数组”这两个词互换使用。它们并不具有相同的含义。
一个恰当的比喻是,列表(例如qw/foo bar baz/) 对应于数组(例如@values),就像字符串(例如'Paul') 对应于标量变量(例如$name).

数组赋值

[编辑 | 编辑源代码]

数组被分配列表的值。值的列表可以任意大或小(甚至可以包含 0 个元素)。

 #!/usr/bin/perl

 @nums = (1,2,3,4,5);

 @more = 6..1000; #using the 'range' operator

 @none = ();  # empty array.

 @names = qw/Paul Michael Jessica Megan/;

 @all = (@nums, @more);  #@all contains all integers from 1 to 1000

最后一个示例说明了 Perl 中一个被称为“数组扁平化”的功能。当数组在列表中使用时,填充列表的是数组的元素,而不是数组本身。如上所述,列表是一组标量值。因此,@all数组包含 1000 个元素,而不是 2 个。

注意
尽管这暗示你不能创建“数组的数组”或“二维数组”,但这些东西在 Perl 中确实存在。它们通过使用引用模拟。

标量上下文中数组

[编辑 | 编辑源代码]

当数组在标量上下文中使用时 - 无论是通过将标量变量分配给数组的值,还是在需要标量的操作或函数中使用它 - 数组都返回其大小。也就是说,它返回它当前包含的元素数量。

 #!/usr/bin/perl

 @names = ('Paul','Michael','Jessica','Megan');

 $how_many = @names;

 print "I have a total of $how_many names\n";
注意
一个常见的误解是,列表在标量上下文中也会返回其大小。这是不正确的。事实上,在标量上下文中不存在列表:在标量上下文中使用逗号运算符不会创建列表,而是从左到右评估每个参数,并返回最后一个参数。

$name = ('Paul','Michael','Jessica','Megan');
 print "The last name in my list is $name\n";

打印数组

[编辑 | 编辑源代码]

一般来说,打印数组的值有两种方法。你可以直接打印数组中的项目列表,或者可以在双引号字符串中插入数组。

 @names = qw/Paul Michael Jessica Megan/;
 print "My names are: ", @names, ".\n";
 print "My names are: @names.\n";

在第一个示例中,print函数被赋予 6 个参数:字符串“我的名字是:”,@names中的四个值中的每一个,以及字符串“。\n”。每个参数都以$,变量的值(默认为空字符串)分隔打印,导致数组中的值“挤压”在一起。

My names are: PaulMichaelJessicaMegan.

在第二个示例中,print函数被赋予一个参数:一个包含插入数组的字符串。当 Perl 插入数组时,结果字符串将包含数组中的所有值,并以$"变量的值(默认为单个空格)分隔。

My names are: Paul Michael Jessica Megan.
注意
两者$,$"变量都可以更改为任何你喜欢的字符串。例如,要以逗号和空格而不是单个空格分隔数组的项目,可以
$" = ', ';
 print "My names are: @names.\n";
My names are: Paul, Michael, Jessica, Megan.

一般来说,你不想这样做,因为根据这些变量的默认值,这可能会在程序的其他部分引起问题!稍后将解释使用自定义分隔符安全地打印数组的方法。

访问数组元素

[编辑 | 编辑源代码]

数组的元素使用方括号内的数字引用访问。因为数组中的每个项目都是一个标量值,你需要使用$来引用一个值。数组的第一个元素是数字 0,所有其他元素都从那里开始向上计数。

负数将从数组的右侧向下计数。这意味着 -1 引用数组的最后一个元素,-3 引用倒数第三个元素。让我们看一些例子。

 @array = (1, 2, 3, 4, 5);
 print $array[0];   # Prints 1
 print $array[3];   # Prints 4
 print $array[-1];  # Prints 5

如果你需要知道最后一个索引怎么办?$#array将为你返回它。

 @array = (1, 2, 3, 4, 5);
 print $array[4];         # Prints 5
 print $array[-1];        # Same as above
 print $array[ $#array ]; # Also prints 5

一个常见的错误是这样做

 print @array[0];  # Also prints 1, but for the wrong reasons

事实上@array[0]是一个切片(即数组的子数组),它包含一个元素,而$array[0]是一个包含值 1 的标量。

常用数组函数

[编辑 | 编辑源代码]

命令行参数

[编辑 | 编辑源代码]

您可能想知道,Perl 脚本支持命令行参数。所有参数都存储在数组中@ARGV中,第一个条目包含第一个命令行参数。如果未传递任何命令行参数,@ARGV将是一个空数组。

上面列出的数组函数和运算符可轻松用于检测传递的命令行参数,以及检测提供的参数数量。

[编辑 | 编辑源代码]
上一个:标量变量 索引 下一个:哈希变量
华夏公益教科书