perl基础:利用Perl的哈希建立键-值数据映射
2008-02-22 18:17
399 查看
Perl的数据结构中最有趣的一个特性是哈希(hash),它使得在数据片段之间建立键—值(key-value)关联成为可能。虽然这些哈希要远远比普通系统中以数字索引的数组用途更广,但是往往也会使初学者不知所措。这就是要写本篇文章的原因所在——它将告诉你如何创建Perl的哈希,如何插入、删除要素,以及如何创建嵌套哈希和利用循环来处理哈希。
定义哈希
首先,什么是哈希?从本质上来说,它是以字符串索引的数组。也就是说,你要使用字符串标签而不用数字来存取各个元素。下面是一个例子:
列表 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
定义哈希
首先,什么是哈希?从本质上来说,它是以字符串索引的数组。也就是说,你要使用字符串标签而不用数字来存取各个元素。下面是一个例子:
列表 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基础:利用Perl的哈希建立键-值数据映射
- 【利用perl的基因数据处理】1.基础的的DNA文件读写和碱基特征统计
- 利用perl对比两个文件,并对数据进行筛选,涉及到哈希的应用和perl编程风格的改变
- 利用Python进行数据分析(14) pandas基础: 数据转换
- 利用Python进行数据分析 基础系列随笔汇总
- 利用内存文件映射拷贝大文件数据
- 使用visio 2010建立sql server数据模型——手动画、利用逆向工程
- 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
- 【Android基础】利用Intent在Activity之间传递数据
- 利用hibernate映射的接口,只重复显示查询到的第一条数据
- 利用Python进行数据分析 pandas基础: 处理缺失数据
- spark入门学习(1)---利用akka建立最基础的通信框架
- perl基础:使用这些Perl 函数控制数组和哈希
- 数据库恢复的基础是利用转储的冗余数据
- 程序员面试宝典之数据结构基础----⑥双链表的建立,插入和删除
- 利用Python数据分析:Numpy基础(三)
- 利用 Python 进行数据分析(四)NumPy 基础:ndarray 简单介绍
- 利用Python数据分析:Numpy基础(五)
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
- 利用Perl把数据库数据导出到Excel文件