PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 65


print  "$i   .  $fields[$i]\n";

XYZZY

O'Reilly,   Inc

Wall,   Larry

a \"glug\"   bit,

5

Error,   Core   Dumped

> Смотри также---------------------------------------------------------------------------------------------

Описание синтаксиса регулярных выражений в perlre{\); документация по стандартному модулю Text::ParseWords.

1.16. Сравнение слов с похожим звучанием

Проблема

Имеются две английские фамилии. Требуется узнать, звучат ли они похожим об­разом (независимо от написания). Это позволит выполнять неформальный по­иск в телефонной книге, в результатах которого наряду со Smith будут присутство­вать и другие похожие имена — например, Smythe, Smite и Smote.

Решение

Воспользуйтесь стандартным модулем Text::Soundex:

use Text  .Soundex;

$CODE = soundex($STRING); ©CODES = soundex(iaLIST);

Комментарий

Алгоритм soundex хэширует слова (особенно английские фамилии) в небольшом пространстве с использованием простой модели, имитирующей произношение по правилам английского языка. Грубо говоря, каждое слово сокращается до че-тырехсимвольной строки. Первый символ является буквой верхнего регистра, а прочие — цифры. Сравнивая значения для двух строк, можно определить, звучат ли они похожим образом.

Следующая программа предлагает ввести имя и ищет в файле паролей имена с похожим звучанием. Аналогичный подход может использоваться для баз данных имен, поэтому при желании можно индексировать базу данных по ключам soundex. Конечно, такой индекс не будет уникальным.


58   Глава 1 • Строки

use Text::Soundex; use  User::pweht;

print  "Lookup user:   "; chomp($user = <ST0IN>); exit unless defined $user; $name_code = soundex($user);

while($uent = getpwentO)  {

(Sfirstname,   $lastname) = $uent->gecos =" /(w+)[~,]*\b(\w+)/;

if ($name_code eq soundex($uent->name) ||

$name_code eq soundex($$lastname)         11

$name_code eq soundex($firstname)        )
{

printf "%s: %s %s\n",  $uent->name,     Sfirstname,   $lastname;




Начало  Назад  Вперед