use Text::Soundex; my @names = qw( McGee MacGee Magee MacGeady Mackintosh McIntosh Griffin Griffith Griffis Griffey Grifferty McGrifferty O'Griffey O'Griffin ); my %hash; $hash{$_} = soundex($_) for @names; printf "%-15s => %s\n", $_, $hash{$_} for sort keys %hash; my @tests = qw( Griffin McGee McGinley Smith ); for my $name( @tests ) { my $soundex = soundex($name); # you can make the search fuzzy in different ways..... my $bit_fuzzy = substr $soundex, 0, 2; my $mid_fuzzy = substr $soundex, 1, 2; print "\nTesting $name ($soundex) ($bit_fuzzy) ($mid_fuzzy)\n\n"; for my $test( keys %hash ) { print "\t$test\n" if $hash{$test} eq $soundex; } print $/; for my $test( keys %hash ) { print "\t$test (bit fuzzy)\n" if $hash{$test} =~ m/$bit_fuzzy../; } print $/; for my $test( keys %hash ) { print "\t$test (mid fuzzy)\n" if $hash{$test} =~ m/.$mid_fuzzy./; } print $/; } __DATA__ Grifferty => G616 Griffey => G610 Griffin => G615 Griffis => G612 Griffith => G613 MacGeady => M230 MacGee => M200 Mackintosh => M253 Magee => M200 McGee => M200 McGrifferty => M261 McIntosh => M253 O'Griffey => O261 O'Griffin => O261 Testing Griffin (G615) (G6) (61) Griffin Griffin (bit fuzzy) Griffis (bit fuzzy) Grifferty (bit fuzzy) Griffith (bit fuzzy) Griffey (bit fuzzy) Griffin (mid fuzzy) Griffis (mid fuzzy) Grifferty (mid fuzzy) Griffith (mid fuzzy) Griffey (mid fuzzy) Testing McGee (M200) (M2) (20) McGee MacGee Magee McGrifferty (bit fuzzy) McGee (bit fuzzy) MacGee (bit fuzzy) Magee (bit fuzzy) Mackintosh (bit fuzzy) McIntosh (bit fuzzy) MacGeady (bit fuzzy) McGee (mid fuzzy) MacGee (mid fuzzy) Magee (mid fuzzy) Testing McGinley (M254) (M2) (25) McGrifferty (bit fuzzy) McGee (bit fuzzy) MacGee (bit fuzzy) Magee (bit fuzzy) Mackintosh (bit fuzzy) McIntosh (bit fuzzy) MacGeady (bit fuzzy) Mackintosh (mid fuzzy) McIntosh (mid fuzzy) Testing Smith (S530) (S5) (53)