Maybe a bit overengineered, but I think this comes close to what you want:
#!/usr/bin/perl
use 5.014002;
use warnings;
use Text::Metaphone;
use Text::Levenshtein::XS qw( distance );
my %price = (
pizza => 12.00,
coke => 1.25,
sandwich => 3.00,
cocacola => 1.25,
pepsicola => 1.25,
);
my %mfp;
$mfp{Metaphone ($_)}{$_}++ for keys %price;
foreach my $product (qw( coke cok cola sandwitch )) {
my $p = $product;
unless (exists $price{$p}) {
warn "No full match for product $p\n";
if (my @similar = keys %{$mfp{Metaphone ($p)} || {}}) {
if (@similar == 1) {
$p = $similar[0];
}
else {
warn "I'm puzzled and don't know which to choose from
+@similar\n";
next;
}
}
}
unless (exists $price{$p}) {
my %d;
$d{distance ($p, $_)}{$_}++ for keys %price;
my @d = sort { $a <=> $b } keys %d;
$d[0] > 2 and next;
my @similar = sort keys %{$d{$d[0]}};
if (@similar == 1) {
$p = $similar[0];
}
else {
warn "I'm puzzled and don't know which to choose from @sim
+ilar\n";
next;
}
}
printf "The price for a %-10s is %6s\n", $p, $price{$p} // "unknow
+n";
}
-->
The price for a coke is 1.25
No full match for product cok
The price for a coke is 1.25
No full match for product cola
The price for a coke is 1.25
No full match for product sandwitch
The price for a sandwich is 3
Enjoy, Have FUN! H.Merijn