这是否可以保证在发生冲突时用%hash2覆盖%hash1?

时间:2011-07-22 08:59:55

标签: perl

%args = (%hash1,%hash2);

当Perl发生冲突时,是否可以保证%hash1覆盖%hash2

3 个答案:

答案 0 :(得分:6)

是的,确实如此。后来的密钥会覆盖之前的密钥。

答案 1 :(得分:4)

如果你没有看到覆盖行为,那么你做错了什么:

#!/usr/bin/perl

use strict;
use warnings;

sub func { print "func\n" }
sub tion { print "tion\n" }

my %args = (
    handler => \&tion,
);

my $dispatch = {
    handler => \&func,
    %args
};

$dispatch->{handler}();

来自perldoc perlglossary

  • 列表
    一组有序的标量值。

来自perldoc perldata

  

LIST会自动插入子列表。也就是说,当评估LIST时,列表中的每个元素都在列表上下文中进行评估,并且结果列表值被内插到LIST中,就好像每个单独的元素都是LIST的成员一样。因此,数组和散列在LIST中失去了它们的身份

  

可以使用包含要解释为键和值的项对的文字列表来初始化哈希。

实际结果是列表上下文中的散列产生键/值对的列表。一旦它是一个列表它有一个订单(它返回的顺序),你永远不能保证键和值将返回的顺序,但列表保证其元素的顺序,所以(a => 1, %h)创建一个列表以"a"开头,后跟1,后跟%h返回的第一个键,后跟%h返回的第一个键,依此类推。然后,该列表将按列表顺序分配给目标哈希,这意味着如果密钥"a"位于%h中,则它将覆盖原始列表。

答案 2 :(得分:0)

没有。该语句根本不修改%hash1。