Я использую String :: Approx , чтобы найти наиболее похожее совпадение для массива из двух элементов из списка других. Я был приятно удивлен, обнаружив, что вы можете использовать amatch()
для сравнения массива с массивом, хотя эта функция не задокументирована; Я был готов написать свою собственную функцию для этого. Я был еще больше удивлен, увидев, что порядок элементов не имеет значения. Но, хотя amatch()
работает безупречно, мне трудно с adist()
. Рассмотрим следующую программу:
#! /usr/bin/perl
use String::Approx qw (amatch adist);
@matches = qw();
%matchhash = qw();
@matchstr = qw(cat dog);
@poss = (['rat', 'hog'],
['gnat', 'frog'],
['giraffe', 'elephant'],
['dig', 'bat'],
['catatonic', 'doggone'],
['care', 'dog'],
['care', 'ding'],
['hawk', 'shark']);
@matches = grep { amatch (@matchstr, @$_) } @poss;
foreach $k (@matches)
{
$dist = adist( @matchstr, @$k );
print "@matchstr has a difference from @$k of $dist \n";
}
И вот что он выводит:
cat dog has a difference from rat hog of 3
cat dog has a difference from gnat frog of 3
cat dog has a difference from dig bat of 3
cat dog has a difference from catatonic doggone of 3
cat dog has a difference from care dog of 3
cat dog has a difference from care ding of 3
Итак, похоже, он выбирает правильные ответы (он игнорировал ['giraffe', 'elephant']
и ['hawk', 'shark']
), но он не может сказать мне расстояние. Конечная цель - упорядочить спички по расстоянию и выбрать тот, который больше всего похож на @matchstr
. amatch()
на самом деле работает так же хорошо, как я думаю, или я просто использую слишком простой ввод? Почему amatch()
не работает?