zoukankan      html  css  js  c++  java
  • Perl Learning 5 Hash

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

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

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

     

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


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



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

    哈希赋值:


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

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


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

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


    当然,也不是全部情况都能够这么做。由于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编程中会好好分析每一个$%的使用方法。感觉自己还非常年轻啊。





  • 相关阅读:
    C++编译器详解(二)常见precompiling 指令介绍
    C++编译器详解(一)
    Music
    jQuery语法
    Freedom DownTime
    A
    Map类
    伤不起:File.toPath() & Paths.get()
    在不同浏览器中空格显示的效果不一致的问题(主要是宽度不一致)
    关于xmlhttp会使用ie的缓存的问题及解决
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7040457.html
Copyright © 2011-2022 走看看