在数组的散列分配中,后面的键总是覆盖前面的键吗?



鉴于此:

%h = (a => 3, b => 4, a => 5);

经验地说,$h{a} == 5成立,但是是否存在$h{a} == 3由于内部字典散列或其他perl内部行为的情况?

另一种提问方式:perl保证

吗?在将数组分配给散列时保持键顺序相同,即使在键碰撞的情况下?对于像%settings = (%defaults, %userflags)这样的事情,重复的键项很方便,所以我可以硬编码默认值,但覆盖用户提供的标志。

是的,你可以相信赋值列表会从左到右求值,就像你可以相信对数组的赋值会按照正确的顺序发生一样。

sub DebugHash::TIEHASH { bless {}, shift }
sub DebugHash::CLEAR { %{shift} = (); }
sub DebugHash::STORE {
my ($tied, $key, $value) = @_;
print STDERR "STORE '$key' => '$value'n";
$tied->{$key} = $value;
}
tie %hash, 'DebugHash';
%hash = (a => 'first', a => 'second', a => 'third',
a => 'fourth', a => 'next', a => 'last');
输出:

STORE 'a' => 'first'
STORE 'a' => 'second'
STORE 'a' => 'third'
STORE 'a' => 'fourth'
STORE 'a' => 'next'
STORE 'a' => 'last'

散列中的键排序看起来相当随机。也就是说,您不能保证转储或查看哈希时的顺序与您分配它的顺序相同(a =>3、b =>4、a =>5);可以显示为(b =>4、a =>5) .

同样,在你的散列中只有两个键值,碰撞只是覆盖第一个:

use Data::Dumper;
my %h = (a => 3, b => 4, a => 5);
print Dumper(%h);
$VAR1 = {
'a' => 5,
'b' => 4
};

我只试了三次就完成了:

$VAR1 = {
'b' => 4,
'a' => 5
};

@mob提到的从左到右的更新是我假设第二次(或第n次)赋值给键将取代前一个值。在这种情况下,您将替换整个哈希,从左到右的顺序将导致包含两个元素的哈希,任何重复的值将是遇到的最后一个键/值。

最新更新