c:\@Work\Perl>perl -wMstrict -le "sub Iterator (&) { return $_[0]; } ;; sub pairs { my @set = @_; my ($i, $j) = (0, 0); ;; return Iterator { $j = ++$i + 1 if ++$j > $#set; ($i, $j) = (0, 0) and return unless $i < $#set; return [ @set[ $i, $j ] ]; }; } ;; my $abcd = pairs(qw(a bee c d)); while (my $p = $abcd->()) { printf qq{(@$p) }; } print ''; ;; while (my $p = $abcd->()) { printf qq{(@$p) }; } " (a bee) (a c) (a d) (bee c) (bee d) (c d) (a bee) (a c) (a d) (bee c) (bee d) (c d)