Arrays 如果值相同,则串联哈希键;如果键相同,则串联哈希值
有没有一种方法可以将散列的键和值合并到一个HOA中?假设我有一个示例输入,如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 下面的代
#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"],
}