in reply to cartesian product preserving order

Set::CrossProduct does exactly what you want.
--
brian d foy <brian@stonehenge.com>