use strict; use warnings; use Data::Dumper; my %continents; while ( ) { chomp; my( $continent, $country ) = split m{:}; push @{ $continents{ $continent } }, $country; } print Data::Dumper->Dumpxs( [ \ %continents ], [ qw{ *continents } ] ); __DATA__ Europe:Germany Europe:France Asia:India Europe:Italy Asia:Japan Asia:Indonesia #### %continents = ( 'Europe' => [ 'Germany', 'France', 'Italy' ], 'Asia' => [ 'India', 'Japan', 'Indonesia' ] );