hash 在 perl 中的用法(转载)
Perl的数据结构中最有趣的一个特性是哈希(hash),它使得在数据片段之间建立键-值(key-value)关联成为可能。虽然这些哈希要远远比普通系统中以数字索引的数组用途更广,但是往往也会使初学者不知所措。这就是要写本篇文章的原因所在??它将告诉你如何创建Perl的哈希,如何插入、删除要素,以及如何创建嵌套哈希和利用循环来处理哈希。
1)定义哈希
首先,什么是哈希?
从本质上来说,它是以字符串索引的数组。也就是说,你要使用字符串标签而不用数字来存取各个元素。下面是一个例子:
列表 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 = ();
2)插入、改变和删除哈希元素
你可以在一个哈希中插入一个新元素(或者更改一个现有的哈希),只需要给与之相对应的键设置一个新的数值就行了。如果这个键不存在,它将会被创建。下面是一个例子:
列表 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;
3)检索键和数值
如果你觉得一个哈希的键和数值有用,需要进一步处理,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 ";
4)计算哈希的大小
计算哈希大小的最简单方法就是用上述的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 ";
5)处理哈希元素
运用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 . " ";
}
6)运用嵌套的哈希
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
hash 在 perl 中的用法(转载)的更多相关文章
- C#中as用法---转载
转载 jiang13824690 发布于2018-07-24 11:19:00 阅读数 3302 收藏 展开 在程序中,进行类型转换时常见的事,C#支持基本的强制类型转换方法,例如 Object o ...
- 转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在 ...
- (转载)mysql中limit用法
(转载)http://hi.baidu.com/sppeivan/item/e45179375d6778c62f8ec221 mysql中limit用法 使用查询语句的时候,经常要返回前几条或者中 ...
- Perl中的hash类型
hash类型 hash类型也称为字典.关联数组.映射(map)等等,其实它们都是同一种东西:键值对.每一个Key对应一个Value. hash会将key/value散列后,按序放进hash桶.散列后的 ...
- perl中sprintf函数的用法
对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法
总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法 总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中 ...
- (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法
总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以及SQL语句中日期格式的表示(#).('')在Delphi中进行字符变量连接相加时单引号用('' ...
- 【转载】Perl中字符串编码的处理
在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...
随机推荐
- localStorage、sessionStorage用法以及区别
设置: sessionStorage.setItem("key", "value");localStorage.setItem("site" ...
- linux安装jdk及解压命令
注意事项:虚拟机安装的系统,不能从桌面直接拖拽传输文件,否则解压出错 查看系统自带安装的java rpm -qa | grep java 删除非.noarch文件 rpm -e --nodeps 文件 ...
- Mysql优化系列之——优化器对子查询的处理
根据子查询的类型和位置不同,mysql优化器会对查询语句中的子查询采取不同的处理策略,其中包括改写为连接(join),改写为半连接(semi-join)及进行物化处理等. 标量子查询(Scalar S ...
- 获取GitHub上远程分支内容
一.clone项目 二.获取远程特定分支的内容 1.查看所有分支 git branch --all # 默认有了ls和master分支,所以会看到如下三个分支 # master[本地主分支] orig ...
- Docker容器中找不到vim命令
docker容器中,有的并未安装vi和vim,输入命令vim,会提示vim: command not found(如下图).此时我们就要安装vi命令 执行命令:apt-get update apt-g ...
- TP内部方法访问
TP定义控制器之后,访问定义的方法: <?php namespace app\index\controller; use think\Controller; class Index extend ...
- laravel5.2加载自定义的aliyun扩展包
把文件夹加载进来 在 app.php里面注册 serviceprovider 在 app/filesystems.php 里面 加入相关的配置 把 cloud的值 改成对应的扩展 在.env文件里面完 ...
- UVa Live 4794 - Sharing Chocolate 枚举子集substa = (s - 1) & substa,记忆化搜索 难度: 2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- leetcode python 030 Substring with Concatenation of All Words
## 您将获得一个字符串s,以及一个长度相同单词的列表.## 找到s中substring(s)的所有起始索引,它们只包含所有单词,## eg:s: "barfoothefoobarman&q ...
- Java面试(一) -- 基础部分(1)
1 .一个".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制?答:可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致.. ...