Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: Check if key exist in hash but not exact match

by Tux (Canon)
on Apr 04, 2023 at 09:52 UTC ( [id://11151461]=note: print w/replies, xml ) Need Help??


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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11151461]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (3)
As of 2024-04-25 21:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found