Pour créer mon correcteur d'orthographe il me faut un fichier
qui n'excède pas 50 Koctets et qui regroupe le plus de mots possible,
une fois ce fichier obtenue il me suffit de le substituer à mon
correcteur personnel dans netscape.
Pour ce faire il suffit de télécharger un package
pour Ispell (francais-irq ou gutenberg ou autre ...) seulement ce sont
des fichiers qui font plus de 500 Koctets car il comprennent les verbes
conjugués. Et c'est là que perl intervient, il suffit de
sortir ses verbes conjugués pour obtenir un fichier de taille raisonnable.
(Il est possible de créer directement un fichier sans les verbes
conjugués depuis ces packages, mais là n'est pas le propos).
aadelmar@free.fr
Le fichier regroupant tout les mots nous l'appellerons dico_source.txt
et le fichier que nous obtiendrons dico_cible.txt
Le programme perl peut être créé sur n'importe
quel éditeur de texte mais avec vi ou emacs ou même
n'importe quel l'interpréteur de commande (terminal) on à
droit à la syntaxe en couleur, ce qui simplifie considérablement
les choses et évite de faire des erreurs de frappes, on l'appellera
dico.pl.
#!/usr/bin/perl -w
# la première ligne est la ligne magique
qui indiquera au système que ce fichier est un programme perl appelé
aussi (shebang).
# On met le nom du fichier qui nous intéresse
dans une variable.
$dico
=
"dico_source.txt"
;
# ou pour travailler depuis un repertoire differant
on place aussi son chemin d'acces
#$dico = "/home/common/prog/perl/dico_source.txt";
#ouvre en lecture en définissant son handle,
sinon previent de l'impossibilité
open FILIN, "
$dico
"
or die
"Ouverture du source pas good $!";
@mots =
<FILIN>;
# associe la variable liste @mots au fichier (handle)
@travail =
<FILOUT>;
# idem en prévision du fichier de sorti (qui n'est toujours pas
défini).
# maintenant on peut fermer le fichier source car il a déjà
stocké le contenu de FILIN dans @mots.
close FILIN or
die "problème de fermeture source $!";
# pour chaque mot de mots, passe au suivant si
il se termine par, ou par ... puis stocke les autre dans @travail
foreach $mot
(@mots) {
chomp
$mot;
#ote les saut de ligne (\n)
next if
$mot
=~/(
ait|aient|ez|ons|ent|er|ir)
$/
ig;
#si c'est des verbes conjugés, dégage les
push
@travail,
$mot;
}
# maintenant on ouvre le fichier cible
open
FILOUT,
">$dicook"
or die
"erreur ouverture cible $!";
print
FILOUT
@travail;
close
FILOUT or die
"erreur de fermeture y'en a marre $!"
;
Et voilà le tour est joué, temps d'exécution pour un fichier de 500 Koctets 3 à 5 secondes alors qu'avec WORD ou WORDPAD et rechercher/remplacer > 2 Heures montre en main si il ne plante pas pendant l'exécution.
récapitulatif sans les commentaires:
#!/usr/bin/perl -w
$dico = "dico_source.txt";
open FILIN, $dico or die "Ouverture du source pas good $!";
@mots = <FILIN>;
@travail = <FILOUT>;
close FILIN or die "problème de fermeture source $!";
foreach $mot (@mots) {
chomp $mot;
next if $mot =~/(ait|it|is|ie|ies|ons|ez|ent|er|ir)$/g;
push @travail, $mot;
}
open FILOUT, ">$dicook" or die "erreur ouverture cible $!";
print FILOUT @travail;
close FILOUT or die "erreur de fermeture y'en a marre $!";
Ce programme est un tout petit aperçu de ce que l'on peut faire
avec Perl, car Perl peut tout faire, mais surtout très pratique
très rapidement avec quelques notions de bash et un soupçon
de C, Perl comprend de suite ce que vous lui demandé.
Les boucles for, if aussi peuvent se construire comme en C et
pleins d'autre chose.
-----------------------------------------------------------------------------------------------autre
exemple fastoche------
Autre exemple pour trier un fichier alphabétiquement
par le premier mot de chaque ligne. Alain Adelmar
#!/usr/bin/perl -w
# remd: petit script perl pour trier alphabétiquement un
fichier (pour dico_uk-fr).
# alain Adelmar
$q =~ /q|quit/;
print "Voici un script qui va trier un fichier alphabetiquement
(chaque ligne du fichier)\nPour continuer taper <Enter> pour quitter
tapez q:\n";
$quitte = <STDIN>;
chomp $quitte;
if ($quitte == $q) {
print "tchao!!!";
system '/bin/clear';
END;
}
print "Indiquer quel fichier vous voulez trier\n";
$f1 = <STDIN>;
chomp $f1;
until (-e $f1) {
print "le nom de fichier complet $f1 n'existe pas veuillez
le re-enter:\n";
$f1 = <STDIN>;
chomp $f1;
}
#séparer le PATH, le nom de fichier et l'extention.
# soit @n2f =split(/\\/, $f1); et prendre le dernier element
de @n2f qui sera le nom du fichier
#soit spliter sur les \ antislash et sur le "." pour sortir: le Path
le nom de fichier et l'extention
# ouverture en lecture du premier fichier
open F1, "$f1" or die "ouverture impossible de $f1 $!";
@contenu1 = <F1>;
close F1 || die "fermeture impossible $!";
# copier le contenu trier dans un fichier d'echange (cop_file1)
$cf1 = "copi_" . "$f1";
open CF1, ">$cf1" or die "création du fichier d\'echange
$cf1 impossible $!";
@nw1 = sort @contenu1;
print CF1 @nw1;
close CF1 || die "Fermeture de $cf1 compromise $!";
# le tri par le premier mot de la ligne -------
foreach $mot(@phrase) {
($mota,$reste)=split(/\,/,$mot,1);
print "$mota\n";
}
@newdic = sort @phrase;
$upd = "tri2" . "$f1";
open U, ">$upd" or die "impossible d\'ouvrir $upd $!";
print U @newdic;
close U || die "impossible de fermer $!";
END;