in reply to open annoyance

There's an additional problem. The result of evaluating sub { func( shift, @_ ) } is undefined because you're modifying and using the same variable more than once in an expression. You cannot know whether func() is going to receive a copy of everything in @_ preceded by an additional copy of $_[0] or whether it will give you $_[0] followed by everything remaining in @_.

func( shift @ary, @ary ); # Is one of the following but which one is not defined: func( $ary[0], @ary ); shift @ary; func( @ary ); shift @ary;

As a related note, you can't say = ( shift() . shift() ) because you can't know which shift() is going to happen first.