[Dresden-pm] Wortgleichheit
Torsten Knorr
create-soft at tiscali.de
So Sep 9 04:23:34 PDT 2007
#!/usr/bin/perl -w
#*** word_distance.pl ***#
#-------------------------------------------------
=head
Hallo Thomas
Warum für einfache Sachen immer schwere Module verwenden.
Der Algorithmus von Herrn Ukkonen ist gut.
Die Implementierung von Helmut weniger.
MfG Torsten
=cut
#-------------------------------------------------
use strict;
use warnings;
#-------------------------------------------------
if(CheckString("Thomas Rittsche", "thomas Ritttsches", 3, 0))
{
print("OK\n");
}
else
{
print("WRONG\n");
}
#-------------------------------------------------
sub CheckString
{
my ($str_right, $str_unknown, $max_distance, $case_sensitive) = @_;
($str_right, $str_unknown) = (lc($str_right), lc($str_unknown)) if($case_sensitive);
return(1) if($str_right eq $str_unknown);
return(0) if(abs(length($str_right) - length($str_unknown)) > $max_distance);
my @r = unpack('c*', $str_right);
my @u = unpack('c*', $str_unknown);
my $errors = my $pos_r = my $pos_u = 0;
LOOP: while($errors <= $max_distance)
{
last(LOOP) if((!$r[$pos_r]) || (!$u[$pos_u]));
if($r[$pos_r] == $u[$pos_u])
{
$pos_r++;
$pos_u++;
next(LOOP);
}
for(my $i = 1; $i <= $max_distance; $i++)
{
if($r[$pos_r] == $u[$pos_u + $i])
{
$errors += $i;
$pos_r++;
$pos_u += ++$i;
next(LOOP);
}
elsif($r[$pos_r + $i] == $u[$pos_u])
{
$errors += $i;
$pos_r += ++$i;
$pos_u++;
next(LOOP);
}
}
$errors++;
$pos_r++;
$pos_u++;
}
for(; $pos_r <= $#r; $pos_r++)
{
$errors++;
}
for(; $pos_u <= $#u; $pos_u++)
{
$errors++;
}
return(1) if($errors <= $max_distance);
return(0);
}
#-------------------------------------------------