Perl哈希:如何处理重复键并获得可能的对

时间:2013-06-20 14:16:10

标签: perl hash perl-module

我有这样的对(数据排序为%哈希格式(我有大数据))
G1-G2
G2,G3
D1-D2
D3-D2
G3-D3
G2-D3

Perl脚本

    use strict;
    use warnings;
    use Data::Dumper;
    my %hash;
    $hash{'G1'}='G2';
    $hash{'G2'}='G3';
    $hash{'D1'}='D2';
    $hash{'D3'}='D2';
    $hash{'G3'}='D3';
    $hash{'G2'}='D3';

    print Dumper \%hash;

Out put
        $ VAR1 = {                   'G1'=> 'G2',           'G2'=> 'D3',           'D3'=> 'D2',           'G3'=> 'D3',           'D1'=> 'D2'         };

这里缺少G2-G3 bcz密钥哈希重复
我需要添加重复项(我可以使用数组但是大数据系统会变慢)

任何快速方法添加对并获得可能对的条件输入

如果$ input ='G2'
获得输出G2->(G3,D3,G1)

如果$ input ='D2'
获得输出D2->(D1,D3)

3 个答案:

答案 0 :(得分:8)

对于给定的哈希键,只能有一个值是正确的。但是,该值可以是一个数组,在您的情况下,它听起来就像您需要的那样。如下所示:

my %hash;
push @{$hash{G1}}, 'G2';
push @{$hash{G2}}, 'G3';
...
push @{$hash{G2}}, 'D3';

哪能得到你:

$VAR1 = {
          'G1' => [
                    'G2'
                  ],
          'G2' => [
                    'G3',
                    'D3'
                  ]
        };

此方法利用了Perl的autovivification,因此我们不需要在附加哈希键之前检查它是否存在。

答案 1 :(得分:1)

我认为在levengli和ldx.a.ldy.c的答案中建议建立小数组是你最好的选择。

或者,您可以使用Hash::MultiValue

答案 2 :(得分:0)

支持散列中多个条目的最佳方法是使用数组引用作为值。在你的情况下,这将意味着

$hash{'G1'}=['G2'];
$hash{'G2'}=['G3', 'D3'];
$hash{'D1'}=['D2'];
$hash{'D3'}=['D2'];
$hash{'G3'}=['D3'];