sub FindRecord { my ($self) = shift; my ($key) = @_; my $ref = \{$self->{$key}}; if (defined $ref->{path}) { my $path = $ref->{path}; foreach my $bit (@$path) { $ref = $ref->{$bit}; } } return $ref; } # ... sub SomeFunc { my ($self) = shift; # ... ${$self->FindRecord($key)} = $value; }