获得完全匹配,但有一个扭曲

Har*_*rry 3 arrays perl hash

我有一些我无法理解的东西

假设我有一个用于接收和拨出的电话列表,如下所示.还指定了from和to位置.

Country1        Country2           number1           number2
USA_Chicago     USA_LA             12                14
AUS_Sydney      USA_Chicago        19                15
AUS_Sydney      USA_Chicago        22                21
CHI_Hong-Kong   RSA_Joburg         72                23
USA_LA          USA_Chigaco        93                27
Run Code Online (Sandbox Code Playgroud)

现在,我想要做的就是删除所有重复项,并仅提供与国家/地区相关的内容作为键和一对中分配给它的每个数字,但该对需要是双向的.

换句话说,我需要返回结果,然后像这样打印它们.

USA_Chicago-USA_LA         27    93   12    14
Aus_Sydney-USA_Chicago     19    15   22    21
CHI_Hong-kong-RSA_Joburg   72    23
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多方法,包括一个普通的哈希表,结果看起来很好,但它没有做双向,所以我会得到它.

USA_Chicago-USA_LA         12    14
Aus_Sydney-USA_Chicago     19    15   22    21
CHI_Hong-kong-RSA_Joburg   72    23
USA_LA-USA_Chicago         93    27
Run Code Online (Sandbox Code Playgroud)

因此重复删除以一种方式工作,但由于还有另一个方向,它不会删除已存在为"USA_Chicago-USA_LA"的重复"USA_LA-USA_Chicago",并将在swopped名称下存储相同的数字.

我最后尝试的哈希表是这样的.(不完全是因为我已经删除了很多并且不得不为此帖重写它)

 @input= ("USA_Chicago USA_LA 12 14" ,
          "AUS_Sydney USA_Chicago 19 15" ,
          "AUS_Sydney USA_Chicago 22 21" ,
          "CHI_Hong-Kong RSA_Joburg 72 23" '
          "USA_LA USA_Chigaco 93 27");

 my %hash;
 for my $line (@input) {
 my ($c1, $c2, $n1, $n2) = split / [\s\|]+ /x, $line6;
 my $arr = $hash{$c1} ||= [];
    push @$arr, "$n1 $n2";
  }
 for my $c1 (sort keys %hash) {

 my $arr = $hash{$c1};
 my $vals = join " : ", @$arr;
 print "$c1 $vals\n";
  }
Run Code Online (Sandbox Code Playgroud)

因此,如果AB存在,BA也是如此,只使用一个,但将要删除的键的值分配给剩余的键.我基本上需要做的是在任何方向摆脱任何重复的键,但将值分配给剩余的键.因此,AB和BA将被视为重复,但AC和BC则不是.-_-

dax*_*xim 5

只需规范化目的地.我选择对它们进行排序.

use strictures;
use Hash::MultiKey qw();

my @input = (
    'USA_Chicago USA_LA 12 14',
    'AUS_Sydney USA_Chicago 19 15',
    'AUS_Sydney USA_Chicago 22 21',
    'CHI_Hong-Kong RSA_Joburg 72 23',
    'USA_LA USA_Chicago 93 27'
);

tie my %hash, 'Hash::MultiKey';
for my $line (@input) {
    my ($c1, $c2, $n1, $n2) = split / [\s\|]+ /x, $line;
    my %map = ($c1 => $n1, $c2 => $n2);
    push @{ $hash{[sort keys %map]} }, @map{sort keys %map};

}
__END__
(
    ['CHI_Hong-Kong', 'RSA_Joburg'] => [72, 23],
    ['AUS_Sydney', 'USA_Chicago'] => [19, 15, 22, 21],
    ['USA_Chicago', 'USA_LA'] => [12, 14, 27, 93],
)
Run Code Online (Sandbox Code Playgroud)