如何计算重复键并将重复键的所有值一起添加到非重复键的新哈希?

ssh*_*rma 1 perl hash key duplicates

嗨,我是新来的perl和初学者阶段请帮​​助我有哈希

%hash = { a => 2 , b=>6, a=>4, f=>2, b=>1, a=>1}
Run Code Online (Sandbox Code Playgroud)

我希望输出为

  • 一次来了3次
  • b来了2次
  • f有一次

应该是一个新的哈希

%newhash = { a => 7, b=>7,f =>2}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

要计算我正在做的哈希键的频率

foreach $element(sort keys %hash) {
    my $count = grep /$element/, sort keys %hash;
    print "$element comes in $count times \n";
}
Run Code Online (Sandbox Code Playgroud)

但通过这样做我得到的输出为:

a comes 1 times 
b comes 1 times 
a comes 1 times
f comes 1 times 
b comes 1 times
a comes 1 times
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

如何获得重复键的正确频率数?如何添加这些重复键的值并存储在新哈希中?

Oes*_*sor 6

根据定义,哈希不能多次使用相同的哈希键.您可能希望将初始数据存储在不同的数据结构中,例如二维数组:

use strict;
use warnings;
use Data::Dumper;

my @data = ( [ a => 2 ], 
             [ b => 6 ],
             [ a => 4 ],
             [ f => 2 ], 
             [ b => 1 ],
             [ a => 1 ],
           );
my %results;

for my $value (@data) {
  $results{$value->[0]} += $value->[1];
}

print Dumper %results;

# $VAR1 = 'a';
# $VAR2 = 7;
# $VAR3 = 'b';
# $VAR4 = 7;
# $VAR5 = 'f';
# $VAR6 = 2;
Run Code Online (Sandbox Code Playgroud)

那说,其他错误的事情:

%hash = { a => 2 , b=>6, a=>4, f=>2, b=>1, a=>1}
Run Code Online (Sandbox Code Playgroud)

你不能这样做,它将hashref({})分配给一个哈希.要么使用%hash = ( ... )$hashref = { ... }.