use Data::Dumper; $Data::Dumper::Deepcopy = 1; my @a = qw/foo bar baz/; my @last = (1); push @last, { $_ => $last[-1] } foreach reverse @a; print Dumper( $last[-1] ); # result #### $VAR1 = { 'foo' => { 'bar' => { 'baz' => 1 } } };