use warnings; use strict; use Data::Dumper; my ( %hashTable, %groupedHash ); while () { my ( $key, $val ) = split; $hashTable{$key} = $val; } groupByCol2( \%hashTable, \%groupedHash ); print Dumper \%groupedHash; sub groupByCol2 { my ( $hashTableRef, $groupedHashRef ) = @_; for my $key ( keys %$hashTableRef ) { push @{ $$groupedHashRef{ $$hashTableRef{$key} } }, $key; } } __DATA__ name1 group1 name2 group2 name3 group1 name4 group4 name5 group2 name6 group7 name7 group4 name8 group5 #### $VAR1 = { 'group4' => [ 'name7', 'name4' ], 'group2' => [ 'name2', 'name5' ], 'group7' => [ 'name6' ], 'group1' => [ 'name1', 'name3' ], 'group5' => [ 'name8' ] };