package Fuzzy::Matcher::Xor2; use strict; use warnings; use Fuzzy::Matcher; use vars qw/$VERSION @ISA/; @ISA=qw(Fuzzy::Matcher); $VERSION=0.01; # Original implementation by [BrowserUk] # bugfixes and modified to fit Fuzzy::Matcher interface by [demerphq] sub fuzz_search { my ($self,$seq)=@_; use bytes; my $FUZZY = $self->{fuzz}; my $seqLen = length $seq; my $keyLen = $self->{strlen}; my ($masked,$pos); my @matches; for my $key ( @{$self->{str_array}} ) { my $mask = $key x ( int( $seqLen / $keyLen ) + 1 ); my $maskLen = length $mask; my $minZeros = chr( 0 ) x int( $keyLen / ( $FUZZY + 1 ) ); my $minZlen = length $minZeros; for my $offset1 ( 0 .. $keyLen-1 ) { $masked = $mask ^ substr( $seq, $offset1, $maskLen ); $pos = 0; while( $pos = 1+index $masked, $minZeros, $pos ) { $pos--; my $offset2 = $pos - ($pos % $keyLen ); my $fuz = $keyLen - ( substr( $masked, $offset2, $keyLen ) =~ tr[\0][\0] ); if( $fuz <= $FUZZY and $offset1+$offset2+$keyLen<=$seqLen) { push @matches,$offset1 + $offset2,$fuz,$key; #printf "\tFuzzy matched key:'$key' -v- '%s' in line: " # . "%2d @ %6d (%6d+%6d) with fuzziness: %d\n", # substr( $seq, $offset1 + $offset2, $keyLen ), # $., , $offset1, $offset2, $fuz; } $pos = $offset2 + $keyLen; } } } return @matches; } 1;