sub lookup { my( $ref, $str ) = @_; return $ref unless length $str; my( $v, $r, $arr ); while ( $str =~ s/^((?:[^\\]|\\.)*?)([:.])//o ){ $r = $2; ( $v = $1 ) =~ s/\\([.:\\])/$1/og; $ref = $arr ? $ref->[$v] : $ref->{$v}; $arr = $r eq ':'; } $str =~ s/\\([.:\\])/$1/g; return $arr ? $ref->[$str] : $ref->{$str}; } my $usr_str = "depTar.name"; my $xml = { 'depTar' => { 'name' => 'c_p20', 'loc' => 'srvr1' }}; print lookup( $xml, $usr_str ); # c_p20