ハッシュの値が重複しているものをリストアップする

back

%hash = チェック対象;

--
my %count = ();
foreach (map {$_->[1]}                 # 6
         sort {$a->[0] <=> $b->[0]}    # 5
         grep { $count{$_->[0]} > 1 }  # 4
         grep { ++$count{$_->[0]} }    # 3
         map { [$hash{$_}, $_] }       # 2
         keys %hash) {                 # 1
  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