^
(?:a|(?(?{ local $fuzzies = $fuzzies; !$fuzzies-- })(?=A)(?=Z)).)
(?:p|(?(?{ local $fuzzies = $fuzzies; !$fuzzies-- })(?=A)(?=Z)).)
(?:p|(?(?{ local $fuzzies = $fuzzies; !$fuzzies-- })(?=A)(?=Z)).)
(?:l|(?(?{ local $fuzzies = $fuzzies; !$fuzzies-- })(?=A)(?=Z)).)
(?:e|(?(?{ local $fuzzies = $fuzzies; !$fuzzies-- })(?=A)(?=Z)).)
(?{ $fuzzies_left = $fuzzies })
$
####
our $USE_A_FUZZY =
'(?(?{ local $fuzzies = $fuzzies; !$fuzzies-- })(?=A)(?=Z))';
our $COUNT_FUZZIES_LEFT =
'(?{ $fuzzies_left = $fuzzies })';
{
my $string = 'apple';
my $max_fuzzies = 2;
my $re = '^';
$re .= sprintf("(?:%s|${USE_A_FUZZY}.)", quotemeta($1))
while ($string =~ /(.)/g);
$re .= "${COUNT_FUZZIES_LEFT}\$";
$re = do { use re 'eval'; qr/$re/ };
our $fuzzies;
local $fuzzies;
our $fuzzies_left;
local $fuzzies_left;
while () {
chomp;
$fuzzies = $max_fuzzies;
if (/$re/) {
$fuzzies = $max_fuzzies - $fuzzies_left;
if ($fuzzies) {
print("Fuzzy match with $_ ($fuzzies fuzzies).$/");
} else {
print("Exact match with $_.$/");
}
} else {
print("No match with $_.$/");
}
}
}
__DATA__
apple
arple
brple
brqle
orange
------ OUTPUT ------
Exact match with apple.
Fuzzy match with arple (1 fuzzies).
Fuzzy match with brple (2 fuzzies).
No match with brqle.
No match with orange.
####
^
(?:a|(?(?{!$fuzzies--})(?=A)(?=Z)).)
(?:p|(?(?{!$fuzzies--})(?=A)(?=Z)).)
(?:p|(?(?{!$fuzzies--})(?=A)(?=Z)).)
(?:l|(?(?{!$fuzzies--})(?=A)(?=Z)).)
(?:e|(?(?{!$fuzzies--})(?=A)(?=Z)).)
$
####
our $USE_A_FUZZY = '(?(?{!$fuzzies--})(?=A)(?=Z))';
{
my $string = 'apple';
my $max_fuzzies = 2;
my $re = '^';
$re .= sprintf("(?:%s|${USE_A_FUZZY}.)", quotemeta($1))
while ($string =~ /(.)/g);
$re .= "\$";
$re = do { use re 'eval'; qr/$re/ };
our $fuzzies;
local $fuzzies;
while () {
chomp;
$fuzzies = $max_fuzzies;
if (/$re/) {
$fuzzies = $max_fuzzies - $fuzzies;
if ($fuzzies) {
print("Fuzzy match with $_ ($fuzzies fuzzies).$/");
} else {
print("Exact match with $_.$/");
}
} else {
print("No match with $_.$/");
}
}
}