use strict; sub nested_value { my $href = shift; my $keys = shift; my $last_key = pop @$keys; for my $key (@$keys) { $href = $href->{$key} ||= {}; } if (@_) { $href->{$last_key} = shift; } return $href->{$last_key}; } my %hash; nested_value(\%hash, [qw/one two three/], 1); print nested_value(\%hash, [qw/one two three/]), "\n"; use Data::Dumper; print Dumper \%hash;