$ perl -le' my @A = ( [ 1, 2 ], [ 3, 4 ] ); print map "[ @$_ ]\n", @A; my @B = ( [ 5, 6 ], [ 7, 8 ] ); print map "[ @$_ ]\n", @B; my @A_B; for my $x ( @A ) { for my $y ( @B ) { push @A_B, [ map( $x->[ 0 ] * $_, @$y ), map $x->[ 1 ] * $_, @$y ]; } } print map "[ @$_ ]\n", @A_B; ' [ 1 2 ] [ 3 4 ] [ 5 6 ] [ 7 8 ] [ 5 6 10 12 ] [ 7 8 14 16 ] [ 15 18 20 24 ] [ 21 24 28 32 ]