in reply to delete from complex hash

That’s because there’s nothing useful in your hash. You wrote:

%hoh = { # ... };

You are assigning a one-element list whose first element is an anonymous hash reference to the %hoh hash. The result:

$ perl -MData::Dumper -e'%hoh = { foo => 1 }; print Dumper \%hoh' $VAR1 = { 'HASH(0x812f180)' => undef };

If you had warnings enabled, Perl would have told you that something is wrong:

$ perl -we'%hoh = { foo => 1 };' Reference found where even-sized list expected at -e line 1.

For your own sanity, get in the habit of using strict and warnings, and pay attention to error messages. That will save you untold hours of stupid mistakes and silly bug headaches.

What you actually want is this:

%hoh = ( # ... );

Once you have that, your delete will work as posted.

Makeshifts last the longest.