我的代码如下
@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.键 - Sam George Luke的价值观 - 伦敦华盛顿上海
然后我
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个键)。
答案 0 :(得分:4)
哈希不保证以任何特定顺序存储密钥和值。这就是@d
和@c
处于您不期望的顺序的原因。
2/8
是在标量上下文中对哈希进行求值的内容。这在此解释:https://stackoverflow.com/a/7428025/4295017。 The following reply提供了来自perldata
的相关引用。
2/8
值作为字符串存储在$b
中。在整数上下文中评估(由$b + 1
操作强加)时,此字符串值将转换为2
。这就是为什么$c
是3
。
答案 1 :(得分:2)
首先,哈希没有任何依赖的顺序,至少可以说。来自keys
哈希条目以明显随机的顺序返回。实际的随机顺序特定于给定的哈希值;两个哈希值上完全相同的一系列操作可能会导致每个哈希值的顺序不同。 [...]
这是有目的的,请参阅reason in perlsec。您可以sort打印或分配它们。
另一个问题是由于在标量上下文中使用了哈希。来自perldata
如果在标量上下文中评估散列,则在散列为空时返回false。如果有任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔。
该文档段落的其余部分进一步解释了这一点。
如果您希望对的数量将keys %h
指定给标量,或者使用scalar。