use strict; use warnings; use Data::Dumper; my %hash; while () { my ( $key, $value ) = split; $hash{$key} = $value; } ## end while () print "Original hash\n", Dumper( \%hash ); my %data_structure; foreach my $key ( keys %hash ) { push @{ $data_structure{ $hash{$key} } }, $key; } ## end foreach my $key ( keys %hash) print "Inverted hash\n", Dumper( \%data_structure ); __DATA__ key1, value1 key2, value2 key3, value1 key4, value3 key5, value2 key6, value4 key7, value4 #### Original hash $VAR1 = { 'key3,' => 'value1', 'key2,' => 'value2', 'key4,' => 'value3', 'key6,' => 'value4', 'key7,' => 'value4', 'key5,' => 'value2', 'key1,' => 'value1' }; Inverted hash $VAR1 = { 'value4' => [ 'key6,', 'key7,' ], 'value1' => [ 'key3,', 'key1,' ], 'value3' => [ 'key4,' ], 'value2' => [ 'key2,', 'key5,' ] };