1

私は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()ですか?

4

2 に答える 2

3

amatchまたはadistの最初の引数として配列を渡して、期待どおりに機能させることはできません。

配列はリストに解凍されるので、amatchが見るものamatch( 'cat', 'dog', 'rat', 'hog' )は、もちろんあなたが意図したものではないようなものです。

最初の引数として配列参照をサポートするamatchとadistの新しいバージョンを作成する必要があります。次に、潜水艦を次のように呼び出す必要がありますmy_amatch(\@matchstr, @$_)

于 2011-05-17T21:11:54.370 に答える
1

amatchはあなたが思っていることをしていません。

qw(cat dog)をqw(cat zzz)に変更しても、同じ結果が得られます。

次に、「hawk」、「shark」を「hawk」、「zzz」に変更しても、同じ結果が得られます。

「猫」との比較だけをしているようです。

于 2011-05-17T21:55:59.967 に答える