in reply to Sending an anonymous hash to a sub

As others have pointed out, you're assigning the contents of @_ to the hash. @_ happens to contain just a hash reference. Now what can you do about this? In all but pathological cases, you won't be using hash-references as hash-keys, so you can do the following: (beautification left as an excercise to the reader)
sub describe { my %person; if (@_ and ref($_[0]) eq 'HASH') { %person = %{+shift}; } %person = @_; ... }
This "flattens" the first argument of the sub if it is a hash reference. Thus, if you call describe( { some=>'args' }, more => 'of_them' ), you'll get %person=(some=>'args',more=>'of_them'); Please note that the ordinary arguments overwrite those of the flattened hash in case of matching keys.