http://qs321.pair.com?node_id=812616


in reply to Pattern searching allowing for mis-matches...

Another option I often use for this sort of thing is Text::Levenshtein. You should use the XS version if available for your platform though as the speed difference is significant. Below I've assumed the string must have the same length, but that is not necessary as an insertion or deletion also counts as distance. Accommodating variable length strings is left as an exercise for the reader. ;-)
use strict; use warnings; use Text::Levenshtein qw(distance); my $text = 'TGATTGAA'; my $search = 'TGAT'; my $fuzz = 1; # how far off a match can we be for my $start (0..(length($text) - length($search)) ) { my $chunk = substr($text,$start,length $search); print "checking for $search from position $start: $chunk: "; my $dist = distance($search, substr($text, $start, length $search)); if($dist == 0) { print "Match!\n"; }elsif($dist <= $fuzz) { print "Close enough\n"; }else{ print "nope\n"; } }

checking for TGAT from position 0: TGAT: Match!
checking for TGAT from position 1: GATT: nope
checking for TGAT from position 2: ATTG: nope
checking for TGAT from position 3: TTGA: nope
checking for TGAT from position 4: TGAA: Close enough

--
I'd like to be able to assign to an luser