However, there are some subs which expect their arguments to be array variables (because the variable's data will be altered). Examples include pop() and shift().
I think this is incorrect. Any list of arguments supplied to a subroutine are inserted into the array @_ and pop and shift handle that accordingly. There's no such thing as subs expecting array variables.