in reply to Check if key exist in hash but not exact match

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