use Data::Dumper; my $list = [ "k0", "k1", "k2", ]; my ($h,$t); $t = $h = {}; foreach my $k ( @{$list}[ 0 .. $#{$list}-1 ] ) { $t->{$k} = {}; $t = $t->{$k}; } $t->{$list->[-1]} = 'val'; print Dumper $h; __END__ $VAR1 = { 'k0' => { 'k1' => { 'k2' => 'val' } } };