我有一个代码如下
@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 个键)。
哈希不保证以任何特定顺序存储键和值。这就是为什么@d
和@c
的顺序是你意想不到的。
2/8
是在标量上下文中计算哈希的内容。这里解释如下:https://stackoverflow.com/a/7428025/4295017。以下回复给出了perldata
的相关引用。
2/8
值以字符串形式存储在$b
中。在整数上下文中计算时(由$b + 1
操作强加),此字符串值将转换为2
。这就是为什么$c
3
.
首先,至少可以说,哈希没有可以依赖的顺序。从键
哈希条目以明显的随机顺序返回。实际的随机顺序特定于给定的哈希;对两个哈希执行完全相同的一系列操作可能会导致每个哈希的顺序不同。 [ ... ]
这是故意的,请参阅perlsec中的原因。您可以对它们进行排序以打印或分配。
另一个问题是由于在标量上下文中使用哈希。来自 perldata
如果在标量上下文中计算哈希,则如果哈希为空,则返回 false。如果有任何键/值对,则返回 true;更准确地说,返回的值是一个字符串,由已使用的存储桶数和分配的存储桶数组成,用斜杠分隔。
该文档段落的其余部分将进一步解释它。
如果要将keys %h
对数分配给标量,或对其使用标量。