来自数组的散列分配中的后面的键是否总是覆盖前面的键?

Do latter keys in an hash assignment from an array always override earlier keys?

鉴于此:

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

理论上 $h{a} == 5 成立,但是否存在 $h{a} == 3 因为内部字典散列或其他一些 perl 内部行为的情况?

另一种提问方式:perl 保证 在将数组分配给散列时保持相同的键顺序,即使在键冲突的情况下也是如此?

重复键条目对于 %settings = (%defaults, %userflags) 这样的事情很方便,所以我可以硬编码默认值但用用户提供的标志覆盖。

key-ordering 在散列中显得相当随机。也就是说,您不能保证转储或查看时的哈希与您分配的顺序相同(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 次)将值分配给键将替换以前的值。在这种情况下,您要替换整个散列,从左到右的顺序将导致包含两个元素的散列,任何重复项的值将是最后遇到的 key/value。

是的,您可以相信赋值列表将从左到右求值,就像您可以相信以正确的顺序对数组赋值一样。

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'