技术分享 利用Perl哈希表建立键-值数据映射

开发 架构
你对Perl语言中Perl哈希表的概念是否了解,Perl的数据结构中最有趣的一个特性是Perl哈希表(hash),它使得在数据片段之间建立键—值(key-value)关联成为可能。

本文和大家重点讨论一下利用Perl哈希表建立键-值数据映射问题,这里告诉你如何创建Perl哈希表,如何插入、删除要素,以及如何创建嵌套PerlPerl哈希表和利用循环来处理Perl哈希表。

Perl基础:利用Perl哈希表建立键-值数据映射

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

定义Perl哈希表

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

列表A

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a'=>'apple',  
  5. 'b'=>'ball',  
  6. 'c'=>'cat',  
  7. 'x'=>'xylophone');  
  8.  

 上面的几行用四对键—值关联建立了一组PerlPerl哈希表。可以注意到,变量名前面的符号%表示它是一个Perl哈希表,箭头用来指出键—值关系。

你也可以这样写代码:

列表B

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a','apple','b','ball','c','cat','x','xylophone');  
  5.  

 在定义了一个Perl哈希表以后,你就可以用定义后的名称对独立的要素进行存取。例如,看下面的代码:

列表C

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a','apple','b','ball','c','cat','x','xylophone');  
  5.  
  6. #accesshashvalue  
  7. print"Aisfor".$alphabet;  
  8.  

 输出结果为:

Aisforapple.

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

列表D

  1. #!/usr/bin/Perl  
  2.  
  3. #(re)initializehash  
  4. %alphabet=();  
  5.  

 插入、改变和删除Perl哈希表元素

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

列表E

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a','apple','b','ball','c','cat','x','xylophone');  
  5.  
  6. #addnewelement  
  7. $alphabet='dog';  
  8.  
  9. #changeexistingelement  
  10. $alphabet='arrow';  
  11.  
  12. #accesshashvalue  
  13. print"Aisfor".$alphabet;  
  14.  

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

列表F

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a','apple','b','ball','c','cat','x','xylophone');  
  5.  
  6. #deleteelement  
  7. delete$alphabet;  
  8.  

 #p#

检索键和数值

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

列表G

  1. #!/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a'=>'apple','b'=>'bat','c'=>'cat');  
  5.  
  6. #getandprinthashkeys  
  7. @keyskeys=keys(%alphabet);  
  8. print"@keys";  
  9.  

 或者,你可以用函数values()获得一个具有Perl哈希表值的数组,如下:

列表H

  1. #!/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a'=>'apple','b'=>'bat','c'=>'cat');  
  5.  
  6. #getandprinthashvalues  
  7. @vals=values(%alphabet);  
  8. print"@v";  
  9.  

 计算Perl哈希表的大小

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

列表I

  1. #!/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a'=>'apple','b'=>'bat','c'=>'cat');  
  5.  
  6. #printnumberofhashelements  
  7. print"Thehashhas".scalar(keys(%alphabet))."elements";  
  8.  

 处理Perl哈希表元素

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

列表J

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a','apple','b','ball','c','cat','x','xylophone');  
  5.  
  6. #loopoverhash  
  7. while(($key,$value)=each(%alphabet)){  
  8. print"$keyisfor$value";  
  9. }  
  10.  

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

列表K

  1. #!/usr/bin/Perl  
  2.  
  3. #definehash  
  4. %alphabet=('a','apple','b','ball','c','cat','x','xylophone');  
  5.  
  6. #loopoverhash  
  7. for$k(keys(%alphabet)){  
  8. print$k."isfor".$hash."";  
  9. }  
  10.  

 运用嵌套的Perl哈希表

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

列表L

  1. #!/usr/bin/Perl  
  2.  
  3. %movies=(  
  4. 'black'=>{'hero'=>'Batman','villain'=>'ThePenguin'},  
  5. 'red'=>[{'hero'=>'Spiderman','villain'=>'GreenGoblin'},  
  6. {'hero'=>'Superman','villain'=>'LexLuthor'}]  
  7. );  
  8.  
  9. #retrieveandprintvalues  
  10. print$movies."fights".$movies."";  
  11.  
  12. print$movies[1]."fights".$movies[1]."";  
  13.  

 该代码返回的结果是:

BatmanfightsThePenguin
SupermanfightsLexLuthor

【编辑推荐】

  1. Perl哈希表用法解析
  2. Perl语言中的五大变量类型
  3. 实例解析Perl守护进程用法
  4. Perl模式匹配经验总结
  5. Perl学习笔记 Perl变量的认识

 

责任编辑:佚名 来源: man.ddvip.com
相关推荐

2010-07-13 16:34:34

Perl 哈希表

2010-07-13 16:20:21

Perl 哈希表

2010-07-16 13:10:36

Perl哈希表

2010-07-16 13:57:13

Perl哈希表

2010-07-15 15:21:07

Perl线程

2010-07-19 09:28:37

Perl关联数组

2010-07-16 13:50:53

Perl哈希表

2010-05-26 15:39:36

SVN服务

2021-11-05 10:07:13

Redis哈希表存储

2010-07-20 16:00:09

Perl模块

2010-07-19 13:42:04

Perl函数

2022-10-27 08:28:06

哈希散列算法

2019-07-15 16:10:00

技术研发指标

2010-07-16 14:30:25

Perl数组

2018-01-08 07:15:18

2022-06-26 06:32:28

MySQL数据库维护

2010-07-06 15:48:46

UML图形

2010-05-25 14:54:18

2021-04-29 10:08:10

数据结构哈希表

2021-11-01 23:57:03

数据库哈希索引
点赞
收藏

51CTO技术栈公众号