我有一些我无法理解的东西
假设我有一个用于接收和拨出的电话列表,如下所示.还指定了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则不是.-_-
只需规范化目的地.我选择对它们进行排序.
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)