exemple:  de traitement de texte

alain Adelmar
                                                                          aadelmar@numericable.fr beuuh c est quoi ca

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;

retour



précèdent | suivant | sommaire