Just a remark: It has been discussed on PM in the past that
the glob function will do most of the work in forming a
cartesian product (I don't remember exactly where, though...)
So, for example,
@a=map {split //} glob "{1,2}{3,4}";
while(@a){$x=shift @a;$y=shift @a;print "{$x,$y} "};
and you can clearly write functions like "cross" by formatting the output to taste.
(Not that this is more efficient than other solutions
presented...probably isn't.)
chas