散列的键和值是否具有相同的"顺序"在Perl?

时间:2014-04-15 19:36:34

标签: perl hash

我知道在perl中没有排序哈希。我关心的是我是否可以依赖索引关系出现的键和值。

说我有这个哈希

my %h = ("a" => 1, "b" => 2, "c" => 3, "d" => 4);

如果我keys %h,我可能会

("b", "a", "d", "c")

我是否可以保证values %h以相同的顺序出现以匹配密钥?我可以期待吗?

(2, 1, 4, 3)

或者不能保证keys %hvalues %h之间存在任何索引关系吗?

2 个答案:

答案 0 :(得分:11)

是。只要散列未更改(插入或删除),keysvalueseach将保持相同的顺序:

  

只要给定的散列未经修改,您就可以依赖键,值和每个散列重复返回相同的顺序。

     

- 来自perldoc -f keys

所以你可以安全地复制像:

这样的哈希
my %orig = ...;
my %copy;
@copy{keys %orig} = values %orig;

答案 1 :(得分:3)

虽然键和值返回其内容的顺序可以 根据机器和实施而有所不同,你可以指望 事实上,他们都会产生相同的订单。或者, 你可以使用"每个"拉动键和值 同一时间:

while (($key,$value) = each %ENV) {
    print "$key=$value\n";
}

使用each的好处是perl不必分配足够的 一次性存储所有键和值,因此效率更高 如果你正在迭代一个大的哈希。