【本文原创,未经同意请勿转载】

哈希是一种数据结构,它和数组的相似之处在于能够容纳随意多的值并能按需取用,而它和数组的不同在于索引方式,数组是以数字来索引。哈希则以名字来索引。也就是说。哈希的索引值,此处称为键(key),并非数字,而是随意唯一的字符串。但它也必须是唯一的字符串。

我们也能够这么看待哈希,试将它想象成一大桶数据,当中每一个数据都有关联的标签。你能够伸手到桶里随意取出一张标签,看它上面附着的数据是什么。可是桶里没有所谓的“第一个”元素,仅仅有一堆数据。是键-值对的集合。

要訪问hash元素,须要使用例如以下语法:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这和訪问数组的做法类似,仅仅是使用了花括号而非方括号来表示索引值(哈希键),訪问哈希表里不存在的值会得到undef。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

要指代整个哈希,能够用百分号(%)作为前缀。哈希能够被转成列表,反之亦然。对哈希赋值等同于在列表上下文中赋值。列表中的元素应该为键-值对。能够将哈希表变成键-值对列表。当然,得到的键-值对不一定是依照当初赋值时的顺序展开。因此选择使用哈希的场合。要么元素存储顺序无关紧要,要么能够easy地在元素输出时进行排序。

哈希赋值:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这会将%any_hash展开成为键-值对列表,看起来是(key,value,key,value,...)这样。然后利用reverse的列表翻转功能形成一个(value,key,value,key,...)这种新列表,键值达成互换。

在将列表赋值到哈希时经常会发现列表中的键-值对并不easy区分。所以引进了胖箭头 =>

当须要增加很多其它的信息的时候。仅仅要确保每行都有一组键-值对和结尾的逗号即可了。

同一时候上面的代码能够简写为:

当然,也不是全部情况都能够这么做。由于hash的键能够是随意形式的字符串。所以要是某个键的内容看起来是Perl的操作符的话,就会出问题。

另一个常见的同意省略键名引號的地方:在花括号里检索特定键名的元素。

哈希函数:keys函数可以返回哈希的键列表,而values函数能返回相应的值列表。

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:18px; font-family:宋体">

abc的顺序会有所不同。可是返回的键列表和值列表的顺序是一致的。

在标量上下文中。这两个函数都会返回哈希中元素(键-值对)的个数。

这个计算过程不必对整个哈希进行遍历。因而很高效。

假设须要迭代(逐项处理当中的每个元素)整个哈希,常见的写法就是用each函数,它能够包括两个元素的列表的形式返回键-值对。

结果:

当Perl运行each%hash却已经没有不论什么键-值对时,each会返回空列表。

假设须要依次按顺序处理哈希。仅仅要对键排序即可了:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:18px; font-family:宋体">

若要检查哈希中是否存在某个键,能够使用exists函数。它能返回真或假,分别表示键存在与否,和键相应的值无关。

Delete函数能从哈希中删除指定的键以及相相应的值。假如没有这种键。它就会直接结束。而不会出现不论什么警告或者错误消息。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这与“将undef存入哈希元素”并不同样。在这两种情况下,exists($book{“betty”})会得出相反的结果。在delete之后,键便不会出如今哈希之中,但存入undef后。键却是一定会存在的。

Perl程序既然执行在某个环境中,就须要对周围的环境有所感知。Perl訪问这些信息的方法是訪问%ENV哈希。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:18px; font-family:宋体">

习题:

第一题:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">结果:

假设打算使用my来声明哈希,则必须在声明之后才干够对元素进行赋值。My操作符智能声明独立的变量。不能用来声明数组或者哈希里的元素。

第二题:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">结果:

附加:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-family:宋体">

第一个foreach循环会逐项处理各个单词。该循环中包括了整个程序里最重要的一行,它会将$count{$word}的值加上1。然后再存回$count{$word}。

第三题:

结果例如以下:

本章节加深了我对Hash表的理解和使用。在之后的Perl编程中会好好分析每一个$和%的使用方法。感觉自己还非常年轻啊。

Perl Learning 5 Hash的更多相关文章

  1. Perl数组和hash相关函数

    Perl数组和hash相关函数 内置的数组函数有: each, keys, pop, push, shift, splice, unshift, values 内置的hash函数有: delete, ...

  2. Perl中的hash类型

    hash类型 hash类型也称为字典.关联数组.映射(map)等等,其实它们都是同一种东西:键值对.每一个Key对应一个Value. hash会将key/value散列后,按序放进hash桶.散列后的 ...

  3. perl learning

    Perl 中文教程 http://cn.perlmaven.com/perl-tutorial learning perl in about 2 hours 30 minutes http://qnt ...

  4. Perl哈希%hash

    哈希是 key/value 键/值对的集合. Perl中哈希变量以百分号 (%) 标记开始. 访问哈希元素格式:${key}. 以下是一个简单的哈希实例: 实例 #!/usr/bin/perl %da ...

  5. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...

  6. Perl匿名数组、hash和autovivification特性

    可有构建匿名的对象,这样就没必要去为只用一两次的数组.hash去取名字,有时候取名是很烦的事. 使用中括号[]构建匿名数组 使用大括号{}构建匿名hash 不包含任何元素的[]和{}分别是匿名空数组. ...

  7. hash 在 perl 中的用法(转载)

    Perl的数据结构中最有趣的一个特性是哈希(hash),它使得在数据片段之间建立键-值(key-value)关联成为可能.虽然这些哈希要远远比普通系统中以数字索引的数组用途更广,但是往往也会使初学者不 ...

  8. Perl系列文章

    0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...

  9. 【深度学习Deep Learning】资料大全

    最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books  by Yoshua Bengio, Ian Goodfellow and Aaron C ...

随机推荐

  1. 多任务-进程之进程池Pool

    1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...

  2. JavaScript内存机制

    内存模型 JS内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象,池存放常量. 基础数据类型与栈内存 JS中的基础数据类型,这些值都有固定的大小, ...

  3. es6 学习7 Set 和 Map 数据结构

     Set 和 Map 数据结构 一.Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const set = new Set([1, 2, 3, 4, ...

  4. luogu P3604 美好的每一天(莫队+二进制)

    这个题还是可以的. 但是卡常卡得我心力憔悴.还是太菜了 我们把一个区间当做一个26位二进制数,每一位代表一个英文,二进制数的每一个位0代表这一位对应的字母出现了偶数次,否则出现了奇数次. 那么一个区间 ...

  5. 查看centos7启动项

    [root@k8s-master ~]# chkconfig Note: This output shows SysV services only and does not include nativ ...

  6. 紫书 例题11-8 UVa 11082(网络流最大流)

    这道题的建模真的非常的秀, 非常牛逼. 先讲建模过程.源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列 的和减去行数, 然后每一行和列之间连一条弧, 容量为 ...

  7. Myeclipse学习总结(7)——Eclipse插件之Maven配置及问题解析

    前言: 今天在自己环境装了Maven环境, 并且安装了Eclipse插件, 在查找插件过程中确实遇到一些问题, 好不容易找到一个  却又有问题. 装好了插件之后, 用Eclipse创建Maven项目却 ...

  8. Android与设计模式——单例(Singleton)模式

    概念: java中单例模式是一种常见的设计模式.单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类仅仅能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...

  9. Oracle单实例情况下的library cache pin的问题模拟与问题分析

    Oracle单实例情况下的library cache pin的问题模拟与问题分析 參考自: WAITEVENT: "library cache pin" Reference Not ...

  10. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...