in reply to Return a list or an iterator

It would be more obvious if Perl arrays were objects (as in Ruby), but remember that the whole point behind the iterater pattern is to be able to do what Perl arrays give you for free.

What do you get by returning an iterator that you don't get by returning an array or an arrayref?

The only thing I can think of is that you can call a "next" method that is non-destructive (unlike shift which is destructive to the array). If you return an array you could just return a copy if you don't want the recipient to destroy your array, but that would be ineficient for large arrays.