Perl Arrays
需要注意的是,本文中所有的示例代码都假设已经包括以下代码。
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
Published on 2013-04-19