本节Perl 教程 中,我们学习哈希表hashes

哈希表hashes 在其他编程语言中,又称做关联数组,词典,或者 映射表?。

它是Perl 中基本的数据结构之一,非常有用。

哈希表是音译,本人认为 映射(表) 是更好的翻译。所以,下文中,用映射(表)。

映射是键-值对的集合。键是字符串;值是标量,可以是数字,字符串,以及引用。关于引用,我们后面会详细讲解。

映射,也是用my关键词来声明。映射的标志符是 %

有些人认为,映射和数组很像,(映射的另一个名字就是关联数组),他们的区别主要:第一,数组是有序的,元素是按顺序索引的。 第二,映射是无序的。你通过键值对中的键,来取得值。因此,不能有重复的键。

声明一个映射

my %color_of;

填入键值对

$color_of{'apple'} = 'red';

$color_of 是映射,'apple' 是键, 'red' 是值。

my $fruit = 'apple';
$color_of{$fruit} = 'red';

请比较以上两个例子的区别。 如果键是一个变量,可以省略引号。

事实上,如果键是一个简单的字符串,也可以省略引号。

$color_of{apple} = 'red';

你可能已经注意到了,如果你想表达的是一个键值对,标志符 $。原因估计你猜到了, 因为表达的是单数概念。

读取映射中一个键值对的值

print $color_of{apple};

如果你所用的键不存在,映射会返回一个undef,在warnings启用的情况下,Perl会给你 warning about uninitialized value 的警告。

print $color_of{orange};

增添更多键值对到映射中,

$color_of{orange} = "orange";
$color_of{grape} = "purple";

声明映射并赋值

my %color_of = (
    "apple"  => "red",
    "orange" => "orange",
    "grape"  => "purple",
);

=> 叫做 胖箭头 或者 长逗号, 用来隔开键值对的键和值。 Perl 中还有个->,叫做瘦箭头。

=> 称作长逗号的原因是,它在这里的功能,其实是和逗号, 类似, 所以,上个例子也可以这样写:

my %color_of = (
    "apple",  "red",
    "orange", "orange",
    "grape",  "purple",
);

Actually, the fat comma allows you to leave out the quotes on the left-hand side makig the code cleaner and more readable.

不过,=> 比逗号好些,因为,如果是长逗号,键的引号可以省略。

my %color_of = (
    apple  => "red",
    orange => "orange",
    grape  => "purple",
);

给键赋值

赋值改变了原有键值对的值。

$color_of{apple} = "green";
print $color_of{apple};     # green

映射的历遍

你需要知道键,然后才能读取值,如果你不知道,可以用 keys 函数来得到所有的键,放到数组中,然后再历遍数组即可。

my @fruits = keys %color_of;
for my $fruit (@fruits) {
    print "The color of '$fruit' is $color_of{$fruit}\n";
}

其实,中间变量@fruits 并不是必须的。

for my $fruit (keys %color_of) {
    print "The color of '$fruit' is $color_of{$fruit}\n";
}

映射的大小

映射的大小指的是映射中键-值对的数目,也就是键的数目就可以了。

print scalar keys %hash;

致谢

本文最初是Felipe da Veiga Leprevost 所写,他同时是本教程 葡萄牙语的译者。