use Data::Dumper; my @stack; my %hash; push @stack, \%hash; while(){ chomp; s/^(\t*)//; splice @stack, length($1)+1; push @stack, $stack[$#stack]->{$_} = {}; } print Dumper(\%hash); __DATA__ foo sub1 sub2 sub21 sub22 bar camel #### $VAR1 = { 'foo' => { 'sub1' => {}, 'sub2' => { 'sub21' => {}, 'sub22' => {} } }, 'bar' => { 'camel' => {} } };