加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl Learning 5 Hash

发布时间:2020-12-15 23:42:47 所属栏目:大数据 来源:网络整理
导读:【本文原创,未经允许请勿转载】 哈希是一种数据结构,它和数组的相似之处在于可以容纳任意多的值并能按需取用,而它和数组的不同在于索引方式,数组是以数字来索引,哈希则以名字来索引。也就是说,哈希的索引值,此处称为键 (key) ,并不是数字,而是任意

【本文原创,未经允许请勿转载】

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

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

?

要访问hash元素,需要使用如下语法:


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



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

?

哈希赋值:


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

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


当需要加入更多的信息的时候,只要确保每行都有一组键-值对和结尾的逗号就行了。同时上面的代码可以简写为:


当然,也不是所有情况都可以这么做,因为hash的键可以是任意形式的字符串,所以要是某个键的内容看起来是Perl的操作符的话,就会出问题。还有一个常见的允许省略键名引号的地方:在花括号中检索特定键名的元素。

哈希函数:keys函数能够返回哈希的键列表,而values函数能返回对应的值列表。


结果:

abc的顺序会有所不同,但是返回的键列表和值列表的顺序是一致的。在标量上下文中,这两个函数都会返回哈希中元素(键-值对)的个数。这个计算过程不必对整个哈希进行遍历,因而非常高效。

?

如果需要迭代(逐项处理其中的每一个元素)整个哈希,常见的写法就是用each函数,它可以包含两个元素的列表的形式返回键-值对。

结果:

当Perl执行each%hash却已经没有任何键-值对时,each会返回空列表。

如果需要依次按顺序处理哈希,只要对键排序就行了:


结果:

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

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


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

?

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


结果:


习题:


第一题:

结果:

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


第二题:

结果:

附加:

结果:

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

?

第三题:


结果如下:


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读