#! perl -slw use strict; sub X ($$) { my( $ra, $rb ) = @_; [ map{ my @x = ref() ? @$_ : $_; map[ ref() ? @$_ : $_, @x ], @$ra; } @$rb ] } my @c = ('red','blue'); my @s = ('small','medium','large'); my @n = (1,2,3,4); print join ' - ', @$_ for @{ X( \@c, \@s ) }; print join ' - ', @$_ for @{ X( X( \@c, \@s ), \@n ) }; __END__ C:\test>xop red - small blue - small red - medium blue - medium red - large blue - large red - small - 1 blue - small - 1 red - medium - 1 blue - medium - 1 red - large - 1 blue - large - 1 red - small - 2 blue - small - 2 red - medium - 2 blue - medium - 2 red - large - 2 blue - large - 2 red - small - 3 blue - small - 3 red - medium - 3 blue - medium - 3 red - large - 3 blue - large - 3 red - small - 4 blue - small - 4 red - medium - 4 blue - medium - 4 red - large - 4 blue - large - 4