【问题标题】:Will keys and values of a hash have the same "order" in Perl?哈希的键和值在 Perl 中是否具有相同的“顺序”?
【发布时间】:2014-04-16 03:46:22
【问题描述】:

我知道在 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之间有任何索引关系?

【问题讨论】:

  • @DaveCross,“RTFM”并不是真正的答案。
  • 这就是为什么我把它写成评论 :-) 但是,说真的,在这种情况下,我认为它是。你的问题的答案都写在FM里了。您已接受 FM 报价的答案。所以,是的,我认为这是一个合理的答案。
  • 如果您在文档中找不到此类信息,请提交错误报告。

标签: perl hash


【解决方案1】:

是的。只要哈希没有改变(插入或删除),keysvalueseach 将保持相同的顺序:

只要未修改给定的哈希值,您就可以依赖键、值和每一个重复返回彼此相同的顺序。

– 来自perldoc -f keys

所以你可以安全地复制一个像这样的哈希:

my %orig = ...;
my %copy;
@copy{keys %orig} = values %orig;

【讨论】:

  • 完美。这正是我需要知道的^.^
  • 但是调用之间的顺序会发生变化。
【解决方案2】:

虽然键和值返回其内容的顺序可以 根据机器和实施而有所不同,您可以依靠 事实上,他们都将产生相同的订单。或者, 您可以使用“每个”功能在 同时:

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

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

【讨论】:

  • 请注意,根据您的 perl 版本,获取键列表然后在哈希中查找每个键实际上可能比使用 each 更快。我不知道如何或为什么,但在“优化”之前进行测试..
  • 谢谢,马克。我可以相信你所说的 keyseach。我相信当 perl 实现foreach my key (keys %myhash) 时,它实际上并没有一次扩展所有键,而是单独扩展它们。
  • @Mark Nodine, foreach my key (keys %myhash) 展平键列表
  • @ikegami - 你是什么意思?哈希的键在插入时被字符串化;没有什么可以压扁的..
  • @Mark Reed,扁平化列表意味着评估列表中的每个项目(在这种情况下,只是 keys)以形成堆栈上的“扁平”标量列表。例如@a,@b,@c 创建一个由@a@b@c 的元素组成的“平面”列表。 Mark Nodine 说他虽然 foreach my key (keys %myhash) 被优化为 while (my ($key) = keys(%myhash)) 之类的东西,但我告诉他不是。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2021-11-23
  • 2018-06-04
  • 1970-01-01
  • 2011-10-04
  • 2019-03-19
  • 2018-11-13
  • 2012-06-09
相关资源
最近更新 更多