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