如果值相同,则连接哈希键,如果键相同,则连接哈希值

Posted

技术标签:

【中文标题】如果值相同,则连接哈希键,如果键相同,则连接哈希值【英文标题】:Concatenation of Hash keys if the values are same and Concatenation of Hash values if the keys are same 【发布时间】:2014-11-21 01:31:03 【问题描述】:

有没有办法在一个 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;
        
    

请指教。

问候, 潜水

【问题讨论】:

您不能有多个具有相同名称的哈希键。您的代码已经“合并了键”,因为如果键已经存在,您将使用它。 我能够通过流程所需的一些简单逻辑来解决这个问题。谢谢你的建议。 【参考方案1】:

如果你想要一个双向关系,那么你只需要两个哈希:

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"],

【讨论】:

以上是关于如果值相同,则连接哈希键,如果键相同,则连接哈希值的主要内容,如果未能解决你的问题,请参考以下文章

来自哈希函数的相同键的不同值和良好的哈希值

ruby 在哈希中删除相同的值多个键

通用字典类键值

如果两个对象的哈希码相同则他们不一定相同,如果对象一致则哈希码一定相同

在 Perl 中测试两个哈希键是不是具有相同的结构

在 PowerShell 中合并哈希表:如何?