#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Carp;
use Algorithm::Combinatorics qw( combinations );
use Set::CrossProduct;
my $str1 = '[TA]TTCGG';
my $e = 2;
find_nb($str1,$e);
sub find_nb {
my ( $str, $d ) = @_;
my @base = $str =~ /\G ( \[ [^][]+ \] | [^][] ) /xg;
#my @base = split //, $str;
for my $exact_distance ( 1 .. $d ) {
my $change_idx_iter
= combinations( [ 0 .. $#base ], $exact_distance );
while ( my $change_idx = $change_idx_iter->next ) {
my @base_combo = map {
my $i = $_;
[ grep { $base[$i] !~ $_ } qw( A T C G ) ];
#[ grep { $base[$i] ne $_ } qw( A T C G ) ];
} @$change_idx;
push @base_combo, [0] if $exact_distance == 1;
my $bases_iter = Set::CrossProduct->new( \@base_combo );
my @neighbour = @base;
while ( my $new_bases = $bases_iter->get ) {
@neighbour[@$change_idx] = @$new_bases;
#$_ = "[$_]" for @neighbour[@$change_idx];
my $str = join( "", @neighbour );
print "$str\n";
}
}
}
return;
}
####
AAACGG
AACCGG
AAGCGG
AATAGG
AATCAG
AATCCG
AATCGA
AATCGC
AATCGG
AATCGT
AATCTG
AATGGG
AATTGG
ACACGG
ACCCGG
ACGCGG
ACTAGG
ACTCAG
ACTCCG
ACTCGA
ACTCGC
ACTCGG
ACTCGT
ACTCTG
ACTGGG
ACTTGG
AGACGG
AGCCGG
AGGCGG
AGTAGG
AGTCAG
AGTCCG
AGTCGA
AGTCGC
AGTCGG
AGTCGT
AGTCTG
AGTGGG
AGTTGG
ATAAGG
ATACAG
ATACCG
ATACGA
ATACGC
ATACGG
ATACGT
ATACTG
ATAGGG
ATATGG
ATCAGG
ATCCAG
ATCCCG
ATCCGA
ATCCGC
ATCCGG
ATCCGT
ATCCTG
ATCGGG
ATCTGG
ATGAGG
ATGCAG
ATGCCG
ATGCGA
ATGCGC
ATGCGG
ATGCGT
ATGCTG
ATGGGG
ATGTGG
ATTAAG
ATTACG
ATTAGA
ATTAGC
ATTAGG
ATTAGT
ATTATG
ATTCAA
ATTCAC
ATTCAG
ATTCAT
ATTCCA
ATTCCC
ATTCCG
ATTCCT
ATTCGA
ATTCGC
ATTCGT
ATTCTA
ATTCTC
ATTCTG
ATTCTT
ATTGAG
ATTGCG
ATTGGA
ATTGGC
ATTGGG
ATTGGT
ATTGTG
ATTTAG
ATTTCG
ATTTGA
ATTTGC
ATTTGG
ATTTGT
ATTTTG
CATCGG
CCTCGG
CGTCGG
CTACGG
CTCCGG
CTGCGG
CTTAGG
CTTCAG
CTTCCG
CTTCGA
CTTCGC
CTTCGG
CTTCGT
CTTCTG
CTTGGG
CTTTGG
GATCGG
GCTCGG
GGTCGG
GTACGG
GTCCGG
GTGCGG
GTTAGG
GTTCAG
GTTCCG
GTTCGA
GTTCGC
GTTCGG
GTTCGT
GTTCTG
GTTGGG
GTTTGG
TAACGG
TACCGG
TAGCGG
TATAGG
TATCAG
TATCCG
TATCGA
TATCGC
TATCGG
TATCGT
TATCTG
TATGGG
TATTGG
TCACGG
TCCCGG
TCGCGG
TCTAGG
TCTCAG
TCTCCG
TCTCGA
TCTCGC
TCTCGG
TCTCGT
TCTCTG
TCTGGG
TCTTGG
TGACGG
TGCCGG
TGGCGG
TGTAGG
TGTCAG
TGTCCG
TGTCGA
TGTCGC
TGTCGG
TGTCGT
TGTCTG
TGTGGG
TGTTGG
TTAAGG
TTACAG
TTACCG
TTACGA
TTACGC
TTACGG
TTACGT
TTACTG
TTAGGG
TTATGG
TTCAGG
TTCCAG
TTCCCG
TTCCGA
TTCCGC
TTCCGG
TTCCGT
TTCCTG
TTCGGG
TTCTGG
TTGAGG
TTGCAG
TTGCCG
TTGCGA
TTGCGC
TTGCGG
TTGCGT
TTGCTG
TTGGGG
TTGTGG
TTTAAG
TTTACG
TTTAGA
TTTAGC
TTTAGG
TTTAGT
TTTATG
TTTCAA
TTTCAC
TTTCAG
TTTCAT
TTTCCA
TTTCCC
TTTCCG
TTTCCT
TTTCGA
TTTCGC
TTTCGT
TTTCTA
TTTCTC
TTTCTG
TTTCTT
TTTGAG
TTTGCG
TTTGGA
TTTGGC
TTTGGG
TTTGGT
TTTGTG
TTTTAG
TTTTCG
TTTTGA
TTTTGC
TTTTGG
TTTTGT
TTTTTG
##
##
TTTTTG
ATTTTG