Perl String:: Приблизительно на массивах
Я использую 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()
за работой?
2 ответа
Вы не можете передать массив в качестве первого аргумента amatch или adist и заставить его работать так, как вы ожидаете.
Массивы распаковываются в списки, поэтому то, что видит amatch, выглядит как amatch( 'cat', 'dog', 'rat', 'hog' )
что, конечно, не то, что вы хотели.
Вам нужно будет создать новые версии amatch и adist, которые поддерживают ссылку на массив в качестве первого аргумента. Затем вам нужно будет вызвать подводные лодки как my_amatch(\@matchstr, @$_)
Аматч не делает то, что вы думаете.
Если вы измените qw (cat dog) на qw (cat zzz), вы получите те же результаты.
Затем, если вы измените "ястреб", "акула" на "ястреб", "zzz", вы все равно получите те же результаты.
Похоже, он только делает сравнение с "кошкой".