我的哈希已经填充了未知数量的字符串键。每个键的值都为零以启动。
我想迭代这个哈希,除了第一个之外的每个元素,使它的值等于我在另一个哈希中的等价物加上这个哈希中的前一个值。所以在数学上类似于:
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;
...
我甚至不确定我知道如何做第一个,因为我不知道价值或关键是什么。我打算先对它进行排序,但由于键可能是列表中的任何键,我无法指定首先是什么。我不知道如何根据密钥引用先前的值。这可能吗?
(我没有任何代码表明我害怕,我试过,但我只是意识到这是非常错的哈哈)
答案 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;
}
结果哈希也不会被排序,因此您有两个选项: