@_ is only passed unchanged to functions called using a prefixing
& and no
() (e.g.
&func).
However
shift is not really a function.
That means
you cannot call it like
&shift.
Shift also takes its arguments in a special
way so the
& syntax would not even make sense, because
& ignores prototypes
(which are needed to obtain
this "special" treatment of arguments from perl code.)
arturo is mostly correct about what shift defaults to,
but note that there are exceptions (that you are
unlikely to encounter anytime soon) where shift will take @ARGV by default within a subroutine. See the docs for more details.