my @a = ( [qw [red blue]], [qw [small medium large]], ); my $l = [1..4]; splice @a, 0, 2, [map {my $x = $_; map {"$x-$_"} @{$a[1]}} @{$a[0]}] while @a > 1; my @x = map {my $x = $_; [map {"$x-$_"} @$l]} @{$a[0]}; say "@$_" for @x; __END__ red-small-1 red-small-2 red-small-3 red-small-4 red-medium-1 red-medium-2 red-medium-3 red-medium-4 red-large-1 red-large-2 red-large-3 red-large-4 blue-small-1 blue-small-2 blue-small-3 blue-small-4 blue-medium-1 blue-medium-2 blue-medium-3 blue-medium-4 blue-large-1 blue-large-2 blue-large-3 blue-large-4