use strict; use warnings; use 5.014; my $raItems = [ qw{ A T G C } ]; my $raTerms = []; makeCombos( $raTerms, 3, $raItems ); say for @$raTerms; sub makeCombos { my( $raTerms, $iters, $raItems, @terms ) = @_; my @localTerms; if ( @terms ) { push @localTerms, map { my $item = $_; map { $_ . $item } @terms } @$raItems; } else { push @localTerms, @$raItems; } $iters --; push @$raTerms, @localTerms; return $iters ? makeCombos( $raTerms, $iters, $raItems, @localTerms ) : (); }