use strict; use warnings; my $string = "ATATGCGCAT"; my @letters = split '', $string; for( my $i=0; $i<2**@letters; ++$i ) { my $b = sprintf("%010b",$i); $b=~tr/01/12/; for( my $j=0; $j<@letters; ++$j ) { print $letters[$j],substr $b, $j, 1; } print "\n"; last if $i==20; # remove if you want all... }