use List::Util 'reduce'; use Carp 'carp'; # a.tree => b.tree => c.tree => ... z.value sub put_element { 'HASH' eq ref( my $root = shift() ) or carp "put_element( \ %..., [ KEY ], $val ) must be a hash reference"; 'ARRAY' eq ref( my $keys = shift() ) or carp "put_element( \ %..., [ KEY ], $val ) must be given an array reference"; my $value = shift; my $leaf = reduce { $a->{$b}{'tree'} ||= {} } $root, @{$keys}[ 0 .. $#$keys - 1 ]; $leaf->{$keys->[-1]}{'value'} = $value; }