sub hamming { my ($x1, $x2) = @_; return -1 if length($x1) != length($x2); (my $xor = $x1 ^ $x2) =~ tr/\x0//cd; } print hamming(@$_), $/ for [qw[ abcdef abccef ]], [qw[ abcdef abc ]], [qw[ abcdef abbbbf ]]; __END__ 1 -1 3 #### # untested my $target = "abcdef"; my $distance = 1; my $len = length $target; my $qr = qr/ \b(\w{$target})\b (?(??{ hamming($target,$1) < $distance }) | (?!)) /x