A solução é simplesmente usar iterators
.
Ao atribuir os resultados de variations_with_repetition
a um escalar, ele gera um iterador que você pode interrogar a cada vez para obter o próximo elemento. Ao fazer isso, você não mantém a lista inteira na memória e tem acesso aos primeiros elementos imediatamente. Este é um conceito adorável chamado avaliação lenta .
Aqui está o código para o seu caso:
use strict;
use warnings;
use Algorithm::Combinatorics 'variations_with_repetition';
my @let = qw / A G C T/;
my $cad = variations_with_repetition(\@let,24);
while(my $c = $cad->next)
{
print "@$c\n";
}
Apenas observe que o iterador realmente retorna uma referência a um array que você deve primeiro desreferenciar e então entrar ou fazer qualquer operação que você goste nele.
Resultados do teste: Eu não consegui rodar o código inicial na minha máquina (o uso da memória cresce indefinidamente como esperado), mas usando iteradores, imediatamente comecei a obter as linhas de saída, com o perl consumindo memória.