my $string = "ATCGC[ATCG]AAA[GA]"; my @out = ($string =~ m/([^\[]*)/)[0]; while ($string =~ m/\[(\w+)\]/g) { @out = map {my $char=$_;map {$_.$char} @out} split//,$1; } print join("\n", @out) . "\n";