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 }