私はString::Aboutを使用して、他のリストから2項目の配列に最も類似した一致を見つけています。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()
ですか?