in reply to Setting a variable equal to a reference

delete $foo->{by_id}{0} deletes an element of the hash %{ $foo->{by_id} }.

The value of that element is a ref. That ref is not referenced by anything else, so it will be freed.

The referenced hash is is referenced by something else (the ref in $foo->{by_name}{bob}), so it won't be freed.

So,

Nothing touches the hash %{ $foo->{by_name} }.

Nothing touches the ref in $foo->{by_name}{bob} (a copy of the ref that was in $foo->{by_id}{0}).

The hash referenced by $foo->{by_name}{bob} is not freed.