我正在使用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()
没有工作?
答案 0 :(得分:3)
您无法将数组作为第一个参数传递给amatch或adist,并让它按预期工作。
数组被解压缩到列表中,所以amatch看到的是amatch( 'cat', 'dog', 'rat', 'hog' )
,这当然不是你想要的。
您必须创建支持数组引用的新版本的amatch和adist作为第一个参数。然后,您需要将潜艇称为my_amatch(\@matchstr, @$_)
答案 1 :(得分:1)
amatch并不'按照你的想法行事。
如果你将qw(猫狗)改为qw(cat zzz),你会得到相同的结果。
然后,如果你将“鹰”,“鲨鱼”改为“鹰派”,“zzz”,你仍会得到相同的结果。
看起来它只与“猫”进行比较。