If I understand correctly, calling if (exists $ref->{A}->{B}->{$key}) { ... } will spring into existence $ref->{A} and $ref->
if (exists $ref->{A}->{B}->{$key}) { ... }
$ref->{A}
$ref->
Take a look at Data::Diver. E.g.:
use Data::Diver qw(Dive); my $ref = { A => { foo => "bar" } }; my $value1 = Dive($ref, qw(A B), $key); my $value2 = Dive($ref, qw(A foo));