[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);
 	}
#-------------------------------------------------