2017-03-17 74 views
0

我有一个代码,如下哈希印刷数量

@array = qw(Sam London George Washington Luke Shanghai); 
my %where = @array; 
my @d = keys %where; 
my @c = values %where; 

print "4. keys - @d values - @c \n"; 

我越来越

4. keys - George Luke Sam values - Washington Shanghai London 

我应该得到4键 - 萨姆·乔治卢克值 - 伦敦华盛顿上海

然后我有

my ($a) = %where; 
my $b = %where; 
my $c = $b + 1; 
print "6. $a $b $c \n" 

为什么我会得到

6. George 2/8 3 

因此,首先,为什么我在将数组更改为哈希值时得到不正确的顺序。 其次,我如何得到2/8和3.相反,我期待6和7,因为散列中有6个元素(3个散列和3个键)。

回答

4

哈希不保证以任何特定顺序存储键和值。这就是为什么@d@c是按照你不指望它们的顺序。

2/8是散列在标量上下文中被评估的内容。这在这里解释:https://stackoverflow.com/a/7428025/4295017The following reply给出了与perldata相关的引用。

2/8值作为字符串存储在$b中。当在整数上下文中计算(由$b + 1操作强加)时,此字符串值将转换为2。这就是为什么$c3

2

首先,哈希没有秩序依赖,至少可以说。从keys

哈希条目以明显随机的顺序返回。实际的随机顺序是特定于给定散列的;两个哈希上完全相同的一系列操作可能会导致每个哈希的顺序不同。   [...]

这是有意完成的,请参阅reason in perlsec。你可以sort他们打印或分配。

另一个问题是由于在标量上下文中使用了散列。从perldata

如果您评估标量上下文中的散列值,它将在散列值为空时返回false。如果有任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的存储段数和分配的存储段数组成,并由斜杠分隔。

该文档的其余部分将进一步解释它。

如果您希望对数分配keys %h标量,或使用scalar上。