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

4
我有这样的一些对(数据已按%hash格式排序(数据规模较大)): 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;

输出
$VAR1 = { 'G1' => 'G2', 'G2' => 'D3', 'D3' => 'D2', 'G3' => 'D3', 'D1' => 'D2' };

这里因为键哈希重复而导致G2-G3缺失。
我需要添加重复项(我可以使用数组,但数据量很大系统会变慢)。

任何快速方法都可以添加一对并得到可能的配对条件输入。

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

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


谢谢,它可以添加多个值。如何获取可能的配对条件输入,如果输入为G2,则如果'print @{$hash {'G2'}};',我将只得到G2->G3,D3,但我需要所有可能的例如G2->G3,D3,G1(G2-G1具有值-键对的链接)。例如2,如果输入为D3,则我需要输出D3->G3,G2。 - user2502386
3个回答

9

您说的没错,对于给定的哈希键只能有一个值。然而,该值可以是一个数组,在您的情况下,听起来这正是您所需要的。因此,可以使用以下内容:

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

这将会得到你:

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

这种方法利用了Perl的自动引用,因此我们不需要在附加之前检查哈希键是否已存在。

谢谢,它可以添加多个值。如何获取可能的配对条件输入,如果输入为G2,则如果'print @{$hash {'G2'}};',我将只得到G2->G3,D3,我需要所有可能的例如G2->G3,D3,G1(G2-G1具有值-键对的链接)。 - user2502386

1
在哈希中支持多个条目的最佳方法是使用数组引用作为值。在您的情况下,这意味着:
$hash{'G1'}=['G2'];
$hash{'G2'}=['G3', 'D3'];
$hash{'D1'}=['D2'];
$hash{'D3'}=['D2'];
$hash{'G3'}=['D3'];

1

我认为像levengli和ldx.a.ldy.c的答案建议的那样构建小数组是你最好的选择。

或者,你可以直接使用Hash::MultiValue


1
Hash::MultiValue 有什么问题吗,还是只是被踩了一下? - innaM
我认为那很明显:我指的是 ldx.a.ldy.c 和 levengli 的解决方案。 - innaM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接