home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December (Special) / PCWorld_2005-12_Special_cd.bin / Bezpecnost / lsti / lsti.exe / framework-2.5.exe / Soundex.pm < prev    next >
Text File  |  2005-01-27  |  4KB  |  151 lines

  1. package Text::Soundex;
  2. require 5.000;
  3. require Exporter;
  4.  
  5. @ISA = qw(Exporter);
  6. @EXPORT = qw(&soundex $soundex_nocode);
  7.  
  8. $VERSION = '1.01';
  9.  
  10. # $Id: soundex.pl,v 1.2 1994/03/24 00:30:27 mike Exp $
  11. #
  12. # Implementation of soundex algorithm as described by Knuth in volume
  13. # 3 of The Art of Computer Programming, with ideas stolen from Ian
  14. # Phillipps <ian@pipex.net>.
  15. #
  16. # Mike Stok <Mike.Stok@meiko.concord.ma.us>, 2 March 1994.
  17. #
  18. # Knuth's test cases are:
  19. # Euler, Ellery -> E460
  20. # Gauss, Ghosh -> G200
  21. # Hilbert, Heilbronn -> H416
  22. # Knuth, Kant -> K530
  23. # Lloyd, Ladd -> L300
  24. # Lukasiewicz, Lissajous -> L222
  25. #
  26. # $Log: soundex.pl,v $
  27. # Revision 1.2  1994/03/24  00:30:27  mike
  28. # Subtle bug (any excuse :-) spotted by Rich Pinder <rpinder@hsc.usc.edu>
  29. # in the way I handles leasing characters which were different but had
  30. # the same soundex code.  This showed up comparing it with Oracle's
  31. # soundex output.
  32. #
  33. # Revision 1.1  1994/03/02  13:01:30  mike
  34. # Initial revision
  35. #
  36. #
  37. ##############################################################################
  38.  
  39. # $soundex_nocode is used to indicate a string doesn't have a soundex
  40. # code, I like undef other people may want to set it to 'Z000'.
  41.  
  42. $soundex_nocode = undef;
  43.  
  44. sub soundex
  45. {
  46.   local (@s, $f, $fc, $_) = @_;
  47.  
  48.   push @s, '' unless @s;    # handle no args as a single empty string
  49.  
  50.   foreach (@s)
  51.   {
  52.     $_ = uc $_;
  53.     tr/A-Z//cd;
  54.  
  55.     if ($_ eq '')
  56.     {
  57.       $_ = $soundex_nocode;
  58.     }
  59.     else
  60.     {
  61.       ($f) = /^(.)/;
  62.       tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/;
  63.       ($fc) = /^(.)/;
  64.       s/^$fc+//;
  65.       tr///cs;
  66.       tr/0//d;
  67.       $_ = $f . $_ . '000';
  68.       s/^(.{4}).*/$1/;
  69.     }
  70.   }
  71.  
  72.   wantarray ? @s : shift @s;
  73. }
  74.  
  75. 1;
  76.  
  77. __END__
  78.  
  79. =head1 NAME
  80.  
  81. Text::Soundex - Implementation of the Soundex Algorithm as Described by Knuth
  82.  
  83. =head1 SYNOPSIS
  84.  
  85.   use Text::Soundex;
  86.  
  87.   $code = soundex $string;            # get soundex code for a string
  88.   @codes = soundex @list;             # get list of codes for list of strings
  89.  
  90.   # set value to be returned for strings without soundex code
  91.  
  92.   $soundex_nocode = 'Z000';
  93.  
  94. =head1 DESCRIPTION
  95.  
  96. This module implements the soundex algorithm as described by Donald Knuth
  97. in Volume 3 of B<The Art of Computer Programming>.  The algorithm is
  98. intended to hash words (in particular surnames) into a small space using a
  99. simple model which approximates the sound of the word when spoken by an English
  100. speaker.  Each word is reduced to a four character string, the first
  101. character being an upper case letter and the remaining three being digits.
  102.  
  103. If there is no soundex code representation for a string then the value of
  104. C<$soundex_nocode> is returned.  This is initially set to C<undef>, but
  105. many people seem to prefer an I<unlikely> value like C<Z000>
  106. (how unlikely this is depends on the data set being dealt with.)  Any value
  107. can be assigned to C<$soundex_nocode>.
  108.  
  109. In scalar context C<soundex> returns the soundex code of its first
  110. argument, and in list context a list is returned in which each element is the 
  111. soundex code for the corresponding argument passed to C<soundex> e.g.
  112.  
  113.   @codes = soundex qw(Mike Stok);
  114.  
  115. leaves C<@codes> containing C<('M200', 'S320')>.
  116.  
  117. =head1 EXAMPLES
  118.  
  119. Knuth's examples of various names and the soundex codes they map to
  120. are listed below:
  121.  
  122.   Euler, Ellery -> E460
  123.   Gauss, Ghosh -> G200
  124.   Hilbert, Heilbronn -> H416
  125.   Knuth, Kant -> K530
  126.   Lloyd, Ladd -> L300
  127.   Lukasiewicz, Lissajous -> L222
  128.  
  129. so:
  130.  
  131.   $code = soundex 'Knuth';              # $code contains 'K530'
  132.   @list = soundex qw(Lloyd Gauss);    # @list contains 'L300', 'G200'
  133.  
  134. =head1 LIMITATIONS
  135.  
  136. As the soundex algorithm was originally used a B<long> time ago in the US
  137. it considers only the English alphabet and pronunciation.
  138.  
  139. As it is mapping a large space (arbitrary length strings) onto a small
  140. space (single letter plus 3 digits) no inference can be made about the
  141. similarity of two strings which end up with the same soundex code.  For 
  142. example, both C<Hilbert> and C<Heilbronn> end up with a soundex code
  143. of C<H416>.
  144.  
  145. =head1 AUTHOR
  146.  
  147. This code was implemented by Mike Stok (C<stok@cybercom.net>) from the 
  148. description given by Knuth.  Ian Phillipps (C<ian@pipex.net>) and Rich Pinder 
  149. (C<rpinder@hsc.usc.edu>) supplied ideas and spotted mistakes.
  150.