ハッシュの値が重複しているものをリストアップする
back
%hash = チェック対象;
--
my %count = ();
foreach (map {$_->[1]}
sort {$a->[0] <=> $b->[0]}
grep { $count{$_->[0]} > 1 }
grep { ++$count{$_->[0]} }
map { [$hash{$_}, $_] }
keys %hash) {
printf "%s\t%d\n", $_, $hash{$_};
}
--
まず、%hash のキーのみのリストを取得し、(1)
[値, キー] の無名配列のリファレンスのリストを取得し、(2)
値をキーとしたチェック用一時ハッシュ(%count)を値を見てインクリメントしつつ(2)の無名配列を返し、(3)
(%hash の値が $count のキーとなり、その値は %hash で値が出現する回数になる)
%count のうち、値の出現回数が2回以上(>1)のときのみ、(2)(3)の無名配列を返し(4)
とりあえず見やすいようにsortし、(5)
(2)で作成した無名配列のキーを取得する。(6)
で、重複しているキーとその値を print です。
back