1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #!/usr/local/bin/perl
use strict;
use warnings;
#----------- Soundex.pl algorithme original de Russel & ODell datant de 1918
my $word = 'le petit chien est blanc-crème';
# Compte tenu que les tables de caractères modernes, permettent maintenant de saisir des lettres majuscules accentuées, il est nécessaire de transcrire ces lettres en lettres simples.
# En particulier, dans la langue française, le c majuscule avec cédille (Ç ) sera transformé en S. De même que le caractère (dans le mot cur par exemple) sera transformé en E.
$word=~ s/é|è|ê|oe/E/g;
$word=~ s/ç/S/g;
# * On retranscrit le mot en majuscules
$word = uc($word);
# * On conserve la première lettre du mot
my ($first_letter, $rest) = ($word =~ /^([A-Z])(.*)$/);
# * On élimine ensuite toutes les voyelles, le H et le W
$rest =~ s/H|W|A|E|I|O|E|U|Y//g;
# * On transcode ensuite les lettres restantes à laide de la table suivante
=h
Lettre Type de consonnance code
B F P V Bilabiales 1
C G J K Q S X Z Labiodentales 2
D T Dentales 3
L Alvéolaires 4
M N Vélaires 5
R Laryngales 6
=cut
$rest =~ tr/BFPVCGJKQSXZDTLMNR/111122222222334556/;
# De plus il est nécessaire de supprimer les espaces morts avant et après le mot ainsi que les blancs et le tiret.
$rest =~ s/\s|-//g;
# * On élimine ensuite toutes les paires consécutives de chiffres dupliquées
# => restera 1 (série impaire) ou 0 (série paire) chiffre
# recherche et suppression des paires de chiffres
$rest =~ s/(\d)\1//g;
# * On ne conserve que 4 caractères du Soundex ainsi obtenu, et on le complète par des zéros le cas échéant
# les 4 premiers?
my $L = length($rest);
if ($L>4){
$rest = substr($rest, 0, 4);
}
elsif($L<4){
my $zero_num = 4 - $L;
$rest .= '0' x $zero_num;
}
# on replace la première lettre du mot ??
$word = $first_letter . $rest;
print $word."\n"; |
Partager