01 my ( $pattern, $mismatches_allowed ) = @_;
####
02 if ( $mismatches_allowed == 0 ) { return $pattern }
####
03 elsif ( length($pattern) <= $mismatches_allowed ) {
04 $pattern =~ tr/ACTG/./;
05 return $pattern;
06 }
####
07 else {
####
08 my ( $first, $rest ) = $pattern =~ /^(.)(.*)/;
####
09 my $after_match = make_approximate( $rest, $mismatches_allowed );
####
10 if ( $first =~ /[ACGT]/ ) {
11 my $after_miss = make_approximate( $rest, $mismatches_allowed - 1 );
12 return (?:$first$after_match|.$after_miss);
13 }
####
14 else { return $first$after_match }
15 }