#!/usr/bin/perl require 5.6.1; use strict; my $hash; $hash = { a => { b=> [ \\\$hash, { c => sub { $_ = shift; return [ join "","j",$_,"h" ]; } } ] } }; sub retrievekey { my $endvalue = shift; my $keys = shift; my @keys = split /\./, $keys; foreach my $x (@keys) { return undef unless defined $endvalue; $endvalue = $$endvalue while (ref($endvalue) eq "REF"); eval { if (ref($endvalue) eq "HASH") { $endvalue = $endvalue->{$x}; } elsif (ref($endvalue) eq "ARRAY") { $endvalue = $endvalue->[$x]; } elsif (ref($endvalue) eq "CODE") { $endvalue = $endvalue->($x); } else { return undef; } }; return undef if ($@); } $endvalue; } print retrievekey($hash, 'a.b.0.a.b.1.c.ap.0'),$/; __DATA__ output: japh