2011-06-20 97 views
2
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。我认为散列%fruit_colorskeys正在以相反的顺序分配给数组@fruits,即最后一个元素首先被分配。是吗?

print @colors;相同的情况为什么黄色而不是红黄色?

回答

10

该顺序是非确定性的,并取决于散列算法的基础实现,该算法可能会发生变化。如果您需要排序结果,您绝不应该依赖排序,而应该添加自己的排序。

perl documentation here

+0

哇,这么短的答案这么多票。我想我会停止回答iOS问题并坚持使用Perl ...他们似乎更加赞赏!谢谢! – Roger

7

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

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

3

Roger说,在使用Perl哈希时不能假定任何订单。

除此之外,建议使用哈希工作时使用fat commas,所以你的初始分配应该是这样的:

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

想象一下,有20键/值对哈希 - 你怎么会知道在对14哪个是关键,哪个是价值?