Foreach on Perl中的哈希变量
我是Perl脚本的新手,对于散列变量的foreach有疑问.我想打印哈希值的所有值.这是一个程序:
%colors = (a => 1,b=>2,c=>3,d=>4,e=>5); foreach $colors(keys %colors) { print "$colors{%colors} n"; } 输出是: 5 3 1 2 4 为什么值随机排序?或者这种随机性背后的逻辑是什么?请澄清我的疑问. 解决方法
我认为你的困惑在于不知道Hash究竟是什么.大多数语言都有类似于键值存储的东西,在Ruby和Perl中它们被称为Hashes,在Java地图中,在Python字典中等等……
它们本质上是一回事,您将一个带有唯一键的值插入到某个底层数据结构中,以便以内存为代价直接访问它. 那么当你向哈希添加一个键和一个值时会发生什么? 哈希是围绕hash functions的思想构建的,当输入计算出一个独特的输出时(理想情况下每个输入都有自己独特的输出).如果两个输入都映射到同一输出,则称为冲突. 现在,我们需要讨论如何实现Hash,两个经典示例是使用单个数组或链接列表数组.我将在下面展示数组示例. 排列 在简单数组的情况下,Hash底层的数据结构只是一个大小的数组.散列函数用于计算该数组的索引.如果我们假设一个简单的哈希算法 h(x) = length(x) % ARRAY_SIZE 这里x是一个字符串,ARRAY_SIZE是我们底层数组的大小,这个语句将确保所有值x都落在0..ARRAY_SIZE – 1的范围内 要查看可视化示例,请考虑大小为5的数组: 0 1 2 3 4 ------------------------------ | | | | | | ------------------------------ 并假设我们正在尝试使用密钥abcd存储值5,根据我们的哈希算法 h('abcd') = length('abcd') % ARRAY_SIZE = 4 % 5 = 4 所以值5将存储在索引4处: 0 1 2 3 4 ------------------------------ | | | | | 5 | ------------------------------ 现在如果我们尝试使用密钥dcba存储值3会发生什么,两个密钥是不同的吗?他们应该映射到不同的地方. h('dcba') = length('dcba') % ARRAY_SIZE = 4 % 5 = 4 哎呀!这个键也映射到索引4,那么我们现在要做什么呢?好吧,我们不能只丢掉键值对,因为程序员显然需要/想要在Hash中进行这种配对,所以我们需要决定在发生碰撞时该怎么做.有许多算法可以做到这一点,但最简单的算法是在数组中查找下一个打开的插槽并存储3个.所以现在我们的数组看起来像: 0 1 2 3 4 ------------------------------ | 3 | | | | 5 | ------------------------------ 这不是一个非常深入的解释,但希望它能让我们深入了解为什么从Hashes中检索值似乎是随机的,因为底层数据结构不断变化,如果你现在要求哈希的密钥可能会回来(3,5),即使你先插入5,只是因为3首先出现在数组中. 希望这有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |