Perl String :: Приблизительно на массивах - PullRequest
1 голос
/ 18 мая 2011

Я использую 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 ]

3 голосов
/ 18 мая 2011

Вы не можете передать массив в качестве первого аргумента amatch или adist и заставить его работать так, как вы ожидаете.

Массивы распаковываются в списки, поэтому то, что видит amatch, выглядит как amatch( 'cat', 'dog', 'rat', 'hog' ), что, конечно, не то, что вы намеревались.

Вам нужно будет создать новые версии amatch и adist, которые поддерживают ссылку на массив в качестве первого аргумента. Затем вам нужно будет вызвать сабвуферы как my_amatch(\@matchstr, @$_)

1 голос
/ 18 мая 2011

Аматч не 'делает то, что вы думаете.

Если вы измените qw (кошка собака) на qw (кошка zzz), вы получите те же результаты.

Затем, если вы измените"Ястреб", "Акула" в "Ястреб", "ZZZ" вы все еще получаете те же результаты.

Похоже, что он только делает сравнение с "кошкой".

...