use strict; use warnings; use Data::Dumper; my %hash; while ( ) { chomp; my @vals = split ':'; if ( scalar( @vals ) % 2 ) { @{ $hash{$vals[0]} }{ @vals[1..($#vals/2)] } = @vals[( ($#vals/2)+1 )..$#vals]; } else { print "Uneven number of elements: $_\n"; } } print Dumper %hash; __DATA__ users:john:mary:1:2 cities:Portland:Amsterdam:New York:Pretty Cool:Awesome:Ugh! misc:foo:bar:baz:Ovid