如何在perl哈希中查找和计算重复值

Sha*_*son 4 perl

我需要在perl哈希中找到重复的值,然后在该计数> 1时输出键/值对和相关的重复计数.

(我可以留下我尝试过的代码样本,但这只会导致大规模的混乱和可能无法控制的笑声,我真的希望通过一些相似的自尊来实现它.)

哈希键/值如下所示:

%hash = qw('FHDJ-124H' => 'hostname1', 'HJDHUR-87878' => 'hostname2', 'HGHDJH-874673' => 'hostname1');
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

2 duplicates found for hostname1
    FHDJ-124H
    HGHDJH-874673
Run Code Online (Sandbox Code Playgroud)

在Solaris上使用perl 5.6 10.不允许升级或加载perl mod的严格控制的生产环境.(转移到5.8的变更请求大约需要6个月).

非常感谢!

ser*_*gio 7

您需要遍历第一个哈希(键/值)中的哈希键,并累积您在另一个哈希值(值/计数)中找到的每个项目的计数.

如果要将键与重复值一起显示,则第二个哈希不能那么简单,因为对于每个重复的值,您将拥有一组键(所有键都具有相同的值).在这种情况下,只需将键累积在一个数组中,然后计算其元素.即,你的第二个哈希就像(value/[key1,key2,key3 ...])

my %hash = ( key1 => "one", key2 => "two", key3 => "one", key4 => "two", key5 => "one" );
my %counts = ();
foreach my $key (sort keys %hash) {
    my $value = $hash{$key}; 
    if (not exists $counts{$value}) {
        $counts{$value} = [];
    }
    push $counts{$value}, $key;
};
Run Code Online (Sandbox Code Playgroud)

然后迭代$ count以输出$ count {$ value}> 1中的元素数时所需的内容

  • 在5.14之前,需要`push @ {$ counts {$ value}},$ key;`,并且`= []`是不需要的,因为未定义的哈希值在这样使用时将自动成为哈希引用. (5认同)