Perl哈希数组入门

Perl的数据结构中最有趣的一个特性是哈希(hash),它使得在数据片段之间建立键—值(key-value)关联成为可能。虽然这些哈希要远远比普通系统中以数字索引的数组用途更广,但是往往也会使初学者不知所措。这就是要写本篇文章的原因所在--它将告诉你如何创建Perl的哈希,如何插入、删除要素,以及如何创建嵌套哈希和利用循环来处理哈希。 

哈希是一种数据结构,和数组类似,可以将值存放到其中,或者从中取回值。但和数组不同的是,其索引不是数字,而是名字。也就是说,索引(这里,我们将它叫key)不是数字而是任意的唯一的字符串。 

key可以是任意的字符串,你可以使用任何的字符串作为key,但它们是唯一的。 

另一种理解hash 的方法是,把它看作一堆数据(a barrel of data),每一个数据都有一个相应的标签。可以通过标签访问此标签对应的元素。但其中是没有“第一个”元素的概念的。在数组中,数组元素从0,1,2 开始编号。但在hash中,没有确定的顺序,因此也没有第一个元素。只是一些key/value 对的集合。 

keys和values均为任意的标量,但keys通常转换为字符串。由于Perl的“没有不必要的限制”的设计哲学:hash可以是任意大小,从空hash(没有key/value对),到任何你内存允许的大小。 

keys是唯一的,但values可以重复。hash的value可以是数字,字符串,undef,或者它们的混合,但key是唯一的。 

哈希相关函数及用法 

1.keys和values函数 
keys函数会返回此hash的所有keys,values函数将返回所有的values。如果hash中没有元素,则此函数将返回空列表。 
my %hash = ("a"=>1, "b"=>2, "c"=>3); 
print my @k = keys %hash; 
print my @v = values %hash; 

2.each函数 
如果想迭代hash的每一个元素,一种通常的方法是使用each函数,它将返回key/value对应的2个元素列表。

当对同一个hash 函数进行一次迭代时,将返回下一个key/value对,直到所有的元素均被访问。如果没有更多的key/value对,则each函数将返回空表。 
my %hash = ("a"=>1, "b"=>2, "c"=>3); 
while(($key, $value) = each %hash){ 
print "$key => $value\n"; 


当然,each返回的key/vlaue对,顺序是混乱的(它其顺序和keys和values函数返回的顺序相同)。如果想将其按序排放,可以对它们排序(使用sort)。 
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4); 
foreach $key (sort keys %hash){ 
$value =$hash{$key}; 
print "$key => $value\n"; 


哈希的通常用法

1.exists函数 
要查看hash中是否存在某个key,可以使用exists函数,如果hash中存在此key,则返回true,与是否有对应的value无关。 
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4); 
if(exists $hash{'a'}){ 
print "true"; 


2.delete 函数 
delete函数将某个给定的key(包括其对应的value)从hash中删除。如果不存在这个key,则什么也不做,不会有警告或者错误信息。 
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4); 
delete $hash{'a'}; 
foreach $key (sort keys %hash){ 
$value =$hash{$key}; 
print "$key => $value\n"; 


3.hash 元素的内插 
你可以在双引号的字符串中使用单个hash元素,但不支持整个hash 的内插。 
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4); 
foreach $key (sort keys %hash){ 
print "$key => $hash{$key}\n"; 


定义哈希 
首先,什么是哈希?从本质上来说,它是以字符串索引的数组。也就是说,你要使用字符串标签而不用数字来存取各个元素。下面是一个例子: 

列表 A 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a' => 'apple', 
'b' => 'ball', 
'c' => 'cat', 
'x' => 'xylophone'); 
上面的几行用四对键—值关联建立了一组Perl 哈希。可以注意到,变量名前面的符号%表示它是一个哈希,箭头用来指出键—值关系。 

你也可以这样写代码: 
列表 B 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a', 'apple', 'b', 'ball', 'c', 'cat', 'x', 'xylophone'); 
在定义了一个哈希以后,你就可以用定义后的名称对独立的要素进行存取。例如,看下面的代码: 

列表 C 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a', 'apple', 'b', 'ball', 'c', 'cat', 'x', 'xylophone'); 
# access hash value 
print "A is for " . $alphabet; 

输出结果为: 
A is for apple. 

要清除哈希,只需简单地把它赋值于一个空的数据集,就像下面的例子: 

列表 D 
#!/usr/bin/perl 
# (re)initialize hash 
%alphabet = (); 

插入、改变和删除哈希元素 
你可以在一个哈希中插入一个新元素(或者更改一个现有的哈希),只需要给与之相对应的键设置一个新的数值就行了。如果这个键不存在,它将会被创建。下面是一个例子: 

列表 E 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a', 'apple', 'b', 'ball', 'c', 'cat', 'x', 'xylophone'); 

# add new element 
$alphabet = 'dog'; 

# change existing element 
$alphabet = 'arrow'; 

# access hash value 
print "A is for " . $alphabet; 

你可以用delete()函数删除一对键—值对,就像下面这样: 

列表 F 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a', 'apple', 'b', 'ball', 'c', 'cat', 'x', 'xylophone'); 
# delete element 
delete $alphabet; 

检索键和数值 
如果你觉得一个哈希的键和数值有用,需要进一步处理,Perl允许将其提取到单独的数据结构中。你可以用函数keys()将一个哈希的键返回成为一个数字索引的数组。下面是一个例子: 

列表 G 
#!/bin/perl 
# define hash 
%alphabet = ('a' => 'apple', 'b' => 'bat', 'c' => 'cat'); 
# get and print hash keys 
@keys = keys(%alphabet); 
print "@keys "; 
或者,你可以用函数values()获得一个具有哈希值的数组,如下: 

列表H 
#!/bin/perl 
# define hash 
%alphabet = ('a' => 'apple', 'b' => 'bat', 'c' => 'cat'); 

# get and print hash values 
@vals = values(%alphabet); 
print "@v "; 

计算哈希的大小 
计算哈希大小的最简单方法就是用上述的keys()函数,将哈希中的键提取到一个数组中,然后检索得到数组的大小,操作方法如下: 

列表 I 
#!/bin/perl 
# define hash 
%alphabet = ('a' => 'apple', 'b' => 'bat', 'c' => 'cat'); 
# print number of hash elements 
print "The hash has " . scalar(keys(%alphabet)) . " elements "; 

处理哈希元素 
运用while()循环处理一个哈希中的所有元素也比较容易。下面是一个简单的例子: 

列表 J 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a', 'apple', 'b', 'ball', 'c', 'cat', 'x', 'xylophone'); 
# loop over hash 
while (($key, $value) = each(%alphabet) ) { 
print "$key is for $value "; 

或者,用前面已经讨论过的for()循环和keys()函数: 

列表 K 
#!/usr/bin/perl 
# define hash 
%alphabet = ('a', 'apple', 'b', 'ball', 'c', 'cat', 'x', 'xylophone'); 
# loop over hash 
for $k (keys(%alphabet)) { 
print $k . " is for " . $hash . " "; 


运用嵌套的哈希 
Perl 也允许在一个哈希(或数组)中再嵌入一个哈希(或数组)。这样就为构建长而复杂的数据结构提供了很大的灵活性,下面是一个例子: 

列表 L 
#!/usr/bin/perl 
%movies = ( 
'black' => {'hero' => 'Batman', 'villain' => 'The Penguin'}, 
'red'   => [{'hero' => 'Spiderman', 'villain' => 'Green Goblin'}, 
{'hero' => 'Superman', 'villain' => 'LexLuthor'}] 
); 

# retrieve and print values 
print $movies . " fights " .  $movies . " "; 
print $movies[1] . " fights " .  $movies[1] . " "; 

该代码返回的结果是: 
Batman fights The Penguin 
Superman fights LexLuthor 
这些基本上就是所有你开始了解Perl中的哈希应该知道的。与数组相关的处理示例如下: 

my %dramatis_personae = ( 
humans => [ 'hamnet', 'shakespeare', 'robyn', ], 
faeries => [ 'oberon', 'titania', 'puck', ], 
other => [ 'morpheus, lord of dreams' ], 
); 

Access it like this: 
foreach my $group (keys %dramatis_personae) { print "The members of $group are\n"; foreach (@{$dramatis_personae{$group}}) { print "\t$_\n"; } } 
--------------------------- 
push(@{$hash{$key}}, $insert_val); 
--------------------------- 
my $array = [];    #create new anonymous array ref 
push (@$array, '11'); 
push (@$array, '12'); 
push (@$array, '13'); 
$hash{'first'} = $array;   # add 

$array = [];   #create a new anon-array 
push (@$array, '21'); 
push (@$array, '22'); 
push (@$array, '23'); 
$hash{'second'} = $array;  # add 

print "Hash content\n"; 
foreach $k (keys %hash) { 
foreach (@{$hash{$k}}) { 
print " : $_"; 

print "\n"; 
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值