my $DATA; my @keys=qw(one two three); # ^--bug in your script I assume # solution 1 eval "\$DATA->{" . join('}{',@keys) . "}= 'value';"; # solution 2 my $d= 'value'; foreach (reverse @keys) { my $x->{$_}=$d; $d= $x; } $DATA->{$keys[0]}= $d->{$keys[0]};