本节Perl 教程中,我们学习Perl 数组。
Perl 中 数组的标志符是@
,即数组名总是以 @
开头。
如果你用了 use strict
,第一次使用时,必须用关键词 my
声明。
需要注意的是,本文中所有的示例代码都假设已经包括以下代码。
use strict;
use warnings;
use 5.010;
声明一个数组:
my @names;
声明然后赋值:
my @names = ("Foo", "Bar", "Baz");
用Data::Dumper显示数组信息
Data::Dumper 是一个Perl 模块,通常用在调试的过过程中,用来查看Perl 变量的信息。
use Data::Dumper qw(Dumper);
my @names = ("Foo", "Bar", "Baz");
say Dumper \@names;
输出:
$VAR1 = [
'Foo',
'Bar',
'Baz'
];
用foreach 循环输出数组内容
my @names = ("Foo", "Bar", "Baz");
foreach my $n (@names) {
say $n;
}
输出:
Foo
Bar
Baz
读取数组元素的值
my @names = ("Foo", "Bar", "Baz");
say $names[0];
注意:是 $names[0] ,而不是 @names[0],看到标志符的变化了么?
@
标志符用来标志数组,很容易想到,数组是个复数的概念。而标志符$
对应的是单数的概念。
你读取数组的某个元素,是个单数,所以标志符$
才是正确的。如果你在学习这个教程,你应该学过英语。
对的,Perl 借鉴了不少自然语言(当然是英语)概念,这也是Perl的独特之处。
数组的索引
几乎所有的编程语言,数组都是从 0 开始索引,最大的索引值是$#name_of_the_array
,即数组元素的个数减去 1 。
my @names = ("Foo", "Bar", "Baz");
say $#names;
输出是 2,因为数组中共有3个元素。
数组元素的个数
数组元素的个数也称作数组的大小,或者长度。Perl 中没有内置的函数能够告诉你数组元素的个数,因为Perl 并不需要这样一个特定的函数。
根据在数组索引中提供的信息,你应该想到,在数组最大索引值的基础上加一就好了,即 $#names+1
。
更常见的做法是用scalar
函数。
my @names = ("Foo", "Bar", "Baz");
say scalar @names;
结果是3。
scalar
其实是给 @names 提供一个上下文,告诉 Perl,想得到一个标量。Perl 返回 @names 中元素的个数。
如果已经有上下文,Perl 则不需要你显示的提示。比如
my @names = ("Foo", "Bar", "Baz");
say @names + 1;
结果是 4;
历遍数组的索引
有时候,仅仅历遍数组的元素本身还不能满足需求。我们需要同时历遍数组中的元素以及其索引,在这中情况下, 只要历遍索引就够了。因为,只要得到了数组中某个元素的索引,就能方便的得到该元素。反之,则是不成立的。
my @names = ("Foo", "Bar", "Baz");
foreach my $i (0 .. $#names) {
say "$i - $names[$i]";
}
结果:
0 - Foo
1 - Bar
2 - Baz
push
增加一个元素到数组的末尾
my @names = ("Foo", "Bar", "Baz");
push @names, 'Moo';
say Dumper \@names;
结果:
$VAR1 = [
'Foo',
'Bar',
'Baz',
'Moo'
];
pop
取出数组的最后一个元素
my @names = ("Foo", "Bar", "Baz");
my $last_value = pop @names;
say "Last: $last_value";
say Dumper \@names;
结果:
Last: Baz
$VAR1 = [
'Foo',
'Bar',
];
取出数组的第一个元素
shift
取出数组的第一个元素,原来的数组剩余的所有元素索引值减一,即向左移动。
my @names = ("Foo", "Bar", "Baz");
my $first_value = shift @names;
say "First: $first_value";
say Dumper \@names;
结果:
First: Foo
$VAR1 = [
'Bar',
'Baz',
];
怎样增加一个元素到数组的开头呢?
unshift