Perl - 如何在哈希中获取前一个键?

时间:2012-09-07 10:27:23

标签: perl hash loops key-value

我的哈希已经填充了未知数量的字符串键。每个键的值都为零以启动。

我想迭代这个哈希,除了第一个之外的每个元素,使它的值等于我在另一个哈希中的等价物加上这个哈希中的前一个值。所以在数学上类似于:

hash1:a = hash2:a;
hash1:b = hash2:b + hash1:a;
hash1:c = hash2:c + hash1:b;
hash1:d = hash2:d + hash1:c;
hash1:e = hash2:e + hash1:d;
...

我甚至不确定我知道如何做第一个,因为我不知道价值或关键是什么。我打算先对它进行排序,但由于键可能是列表中的任何键,我无法指定首先是什么。我不知道如何根据密钥引​​用先前的值。这可能吗?

(我没有任何代码表明我害怕,我试过,但我只是意识到这是非常错的哈哈)

2 个答案:

答案 0 :(得分:5)

哈希本身是无序的,因此他们不知道“先前”键。您需要使用keys函数提取密钥,对它们进行排序(如您所述),然后参考密钥列表的前一个元素,找出您所选订单中的上一个密钥是什么。< / p>

获得上一个密钥后,您可以使用通常的$hash{$key}语法从哈希值中访问该值。

然后诀窍就是访问列表中的上一个键,这可能需要通过索引迭代列表,因为foreach循环不会让您知道目前列表中的位置。像

这样的东西
for (my $i = 0; $i <= $#keys; ++$i) {
    if ($i == 0) { ... } # first key
    else { ... } # all other keys
}

可能合适。

答案 1 :(得分:0)

这基本上是所有哈希值的累积和

a’ = (0) + a
b’ = (0  + a) + b
c’ = (0  + a  + b) + c
d’ = 0 + ...

迭代哈希,存储总和并始终添加当前值(或将总和加到当前值,无关紧要,加法是可交换的)应该可以得到所需的结果。 请注意,您必须首先对键进行排序,因为根据定义,哈希值是无序的。

$sum = 0;
foreach my $k (sort keys %hash) {
  $hash{$k} += $sum;
}

结果哈希也不会被排序,因此您有两个选项:

  • 每次使用哈希(迭代它)时,您必须迭代排序的键,然后访问该键位置的哈希值。只需使用我上面给出的循环,并将其身体与任何你想要的东西交换。
  • 将您的总和存储在列表/数组中。这些数据结构不会更改它们的值顺序(但您不会有键值对;只有值)。