Also, sometimes you just want to work on an arbitrary list of items. If you process one item and then shift it, that's a reasonable thing to do.
2. If you adopted the convention in 1, this shouldn't bite you. (I've never actually encountered this issue myself...)
3. You are misinformed. You can easily do something along the lines of:
f({a => 'foo', b => 'bar'});
sub f{ my ($args) = @_; say $args->{a}; }
There's probably a module of CPAN to do this even nicer.