私には頭の中で理解できないものがあります
以下のように、受信とダイヤルアウトに使用される電話リストが保存されているとします。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
ここでやりたいことは、すべての重複を削除し、国に関連するもののみをキーとして割り当て、各番号をペアで割り当てることですが、ペアは双方向である必要があります。
つまり、結果を取得してから、このように出力する必要があります。
USA_Chicago-USA_LA 27 93 12 14
Aus_Sydney-USA_Chicago 19 15 22 21
CHI_Hong-kong-RSA_Joburg 72 23
通常のハッシュテーブルを含む多くの方法を試しましたが、結果は問題ないように見えますが、双方向を実行しないため、代わりにこれを取得します。
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
したがって、重複の削除は 1 つの方法で機能しますが、別の方向があるため、既に "USA_Chicago-USA_LA" として存在する重複した "USA_LA-USA_Chicago" は削除されず、同じ番号がスワップされた名前で保存されます。
最後に試したハッシュテーブルはこんな感じ。(私がたくさんを捨てて、この投稿のために書き直さなければならなかったのとは正確には異なります)
@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";
}
したがって、AB が存在し、BA も存在する場合は、1 つだけを使用しますが、削除されるキーの値を残りのキーに割り当てます。基本的に必要なのは、任意の方向の重複キーを取り除くことですが、残りのキーに値を割り当てます。したがって、AB と BA は重複と見なされますが、AC と BC は重複していません。-_-