Earlier quoted context omitted.
The problem is in practice @_ is abused like crazy. For example: 1) I've often seen people shift from @_ half way in the middle of a function. If you really want to be certain about a method's formal parameters you have to read the entire function. 2) Also @_ is used in other circumstances which can cause mass confusion. For example Try::Tiny uses @_. It is difficult to guess if you getting a formal parameter or some…
1) Adopt a convention of extracting your arguments at the beginning of the function. 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:…
some_func(\%$some_object, \%some_hash);
and used variables like $a and $b as mainline code parameters...
However, if having dangerous features were something to hold against a language in general, nobody would be using C (maybe Linux in such an alternate universe would be written in Fortran or some other abomination). On the whole, I think that well-written Perl is very good. Poorly written Perl is... well, poorly written.