perl String ::在数组上约

时间:2011-05-17 21:01:32

标签: arrays perl cpan fuzzy-comparison

我正在使用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 个答案:

答案 0 :(得分:3)

您无法将数组作为第一个参数传递给amatch或adist,并让它按预期工作。

数组被解压缩到列表中,所以amatch看到的是amatch( 'cat', 'dog', 'rat', 'hog' ),这当然不是你想要的。

您必须创建支持数组引用的新版本的amatch和adist作为第一个参数。然后,您需要将潜艇称为my_amatch(\@matchstr, @$_)

答案 1 :(得分:1)

amatch并不'按照你的想法行事。

如果你将qw(猫狗)改为qw(cat zzz),你会得到相同的结果。

然后,如果你将“鹰”,“鲨鱼”改为“鹰派”,“zzz”,你仍会得到相同的结果。

看起来它只与“猫”进行比较。