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