use List::Util qw(reduce); use Data::Dumper; my @c = (1, 2, 3, 4); my %d; reduce { $a->{$b} ||= {} } \%d, @c; print Dumper \%d; #### $VAR1 = { '1' => { '2' => { '3' => { '4' => {} } } } }; #### (reduce { $a->{$b} ||= {} } \%d, @c[0..$#c-1])->{$c[$#c]} = 42; print Dumper \%d; #### $VAR1 = { '1' => { '2' => { '3' => { '4' => 42 } } } };