键/值的分配顺序是什么?

时间:2011-06-20 13:55:23

标签: perl hash

my %fruit_colors = ("apple", "red", "banana", "yellow");
my @fruits = keys %fruit_colors;
my @colors = values %fruit_colors;
print @fruits;            #output is: bananaapple
print "\n";
print @colors;            #output is: yellowred

键盘链接:http://codepad.org/I0wrTPSe

有人可以解释一下,为什么print @fruits;的输出是bananaapple。我以为这将是applebanana。我认为散列keys的{​​{1}}将以相反的顺序分配给数组%fruit_colors,即最后一个元素首先被分配。是吗?

@fruits相同的情况为什么会变黄而不是redyellow?

3 个答案:

答案 0 :(得分:10)

顺序是非确定性的,取决于可能会发生变化的哈希算法的底层实现。您永远不应该依赖订购,如果您需要排序结果,则应该添加自己的排序。

请参阅perl documentation here

答案 1 :(得分:7)

perldoc -f keysperldoc附带Perl。在学习这门语言时,至少要先阅读一些关于语言的内容是很有用的:

  

散列的键以明显随机的顺序返回。实际的随机顺序在未来的Perl版本中可能会发生变化,但保证与值或每个函数产生的顺序相同(假设散列未被修改)。从Perl 5.8.1开始,出于安全原因,即使在不同的Perl运行之间,顺序也可能不同(请参阅perlsec中的算法复杂性攻击)。

答案 2 :(得分:3)

罗杰说,在使用Perl哈希时,没有任何命令可以保证。

除此之外,建议在使用哈希时使用fat commas,因此您的初始分配应如下所示:

my %fruit_colors = ("apple" => "red", "banana" => "yellow");

想象一下,拥有20个键/值对的哈希 - 你怎么知道第14对哪个是键,哪个是值?