use strict; use warnings; use Data::Dumper; my $l = 6; #Motif Length my $d = 2; my $str = 'TTTCGG'; my @nucs = qw/A T C G/; my @enum = enum( $l, \@nucs ); foreach my $oligo ( @enum ) { if ( hd ($oligo,$str) <= $d ) { print "$oligo\n"; } } sub hd { return ( $_[0] ^ $_[1] ) =~ tr/\001-\255//; } sub enum { return @{ $_[1] } unless --$_[0]; map { my $nuc = $_; map { $nuc . $_ } @{ $_[1] } } enum( $_[0], $_[ 1 ] ); }