Arrays 如果值相同,则串联哈希键;如果键相同,则串联哈希值

Arrays 如果值相同,则串联哈希键;如果键相同,则串联哈希值,arrays,perl,hash,Arrays,Perl,Hash,有没有一种方法可以将散列的键和值合并到一个HOA中?假设我有一个示例输入,如 #NewName OldName Axc.Sx2.1_Axc.Wx2.1 1BDER Axc.Sx2.1_Axc.Wx2.1 1ADER 在上面的代码中,哈希值不同,但其键相同;而在下面的代码中,哈希值相同,但键不同 Axc.Sx2.1_Axc.Wx2.1 1BDER Axc.Sx2.1_Axc.Wx2.1 1BDER Axc.Sx2.1 1BDER 下面的代

有没有一种方法可以将散列的键和值合并到一个HOA中?假设我有一个示例输入,如

#NewName              OldName
Axc.Sx2.1_Axc.Wx2.1  1BDER
Axc.Sx2.1_Axc.Wx2.1  1ADER
在上面的代码中,哈希值不同,但其键相同;而在下面的代码中,哈希值相同,但键不同

Axc.Sx2.1_Axc.Wx2.1  1BDER
Axc.Sx2.1_Axc.Wx2.1  1BDER
Axc.Sx2.1            1BDER
下面的代码可以处理值的合并,但不能处理键的合并

 while (<$mapF>) {
        chomp $_;
        next if /^\s*(#.*)?$/;
        next if /^\s+.*$/;
        ##latestRuleName OldRuleName
        if ( $_ =~ /(\S+)\s+(\S+)/gi ) {
            # create list and append $2
           push @{ $mapHash{$1} }, $2;
        }
    }
while(){
大口大口;
下一个if/^\s*(#。*)?$/;
下一个if/^\s+.*$/;
##latestRuleName OldRuleName
如果($\u=~/(\S+)\S+(\S+)/gi){
#创建列表并追加$2
推送{$mapphash{$1}},$2;
}
}
请告知

问候,,
如果您想要双向关系,那么只需要两个哈希:

use strict;
use warnings;

my %new2old;
my %old2new;

while (<DATA>) {
    my ( $new, $old ) = split ' ';
    push @{ $new2old{$new} }, $old;
    push @{ $old2new{$old} }, $new;
}

use Data::Dump;

dd \%new2old;
dd \%old2new;

__DATA__
Axc.Sx2.1_Axc.Wx2.1  1BDER
Axc.Sx2.1_Axc.Wx2.1  1ADER
Axc.Sx2.1            1BDER

不能有多个同名哈希键。您的代码已经“合并密钥”,即如果密钥已经存在,您将使用该密钥。我能够按照流的要求使用一些简单的逻辑来解决这个问题。谢谢你的建议。
{
  "Axc.Sx2.1" => ["1BDER"],
  "Axc.Sx2.1_Axc.Wx2.1" => ["1BDER", "1ADER"],
}
{
  "1ADER" => ["Axc.Sx2.1_Axc.Wx2.1"],
  "1BDER" => ["Axc.Sx2.1_Axc.Wx2.1", "Axc.Sx2.1"],
}