I would not have expected #3's behavior. Would you? I think it merits an "undef is not a listop" warning. The correct way to undef the values is:
@h{qw|a b c|} = ();
The correct way to autovivify them but leave them unmodified if they already exist is
() = \@h{qw(a b c)};
Caution: Contents may have been coded under pressure.