#! /usr/bin/perl # Ce programme permet de répartir les mots d'un fichier dans plusieurs # autres fichiers (un mot par ligne). On peut interrompre l'opération et # la reprendre plus tard. Attention : le fichier d'origine est modifié # à la fin de la session ! Les mots qui ont été répartis en sont retirés. # Le nombre maximum de fichiers est fixé à 10. # # Ce programme utilise le module Term::ReadKey (2.12), disponible sur CPAN. use Term::ReadKey; use FileHandle; use strict; # ------------------------------------------------------------ my $MAX_FICHIERS = 8; # Attention, si vous augmentez ce nombre, il faut # modifier le reste du programme # ------------------------------------------------------------ # Précaution... $SIG{INT} = \&ctrl_C; # Pour éviter de laisser le terminal inutilisable # Vérif. du nbre d'args if (@ARGV < 3 || @ARGV > $MAX_FICHIERS + 1) { print STDERR "\ repartmots: SYNTAXE: repartmots fichier_orig fichier_1 fichier_2 [... fichier_$MAX_FICHIERS]\n"; exit (2); } # Ouvert. des fichiers unless (open LISTE_MOTS, $ARGV[0]) { print STDERR "repartmots: impossible d'ouvrir le fichier $ARGV[0] !\n"; exit (3); } my @fichier; for (my $i = 1; $i < @ARGV; $i++) { $fichier[$i] = new FileHandle; unless ($fichier[$i]->open(">>$ARGV[$i]")) { print STDERR "\ repartmots: impossible d'ouvrir le fichier $ARGV[$i] pour lui ajouter des données !\n"; exit (4); } } # Boucle principale my ($mot, $sauv, $touche, $no_fichier); $sauv = 0; for (;;) { print "****************************************************************\n\n"; unless ($sauv) { # si on vient de sauver, on ne lit pas de nouvelle ligne if (eof LISTE_MOTS) { print "\nFin du fichier atteinte !\n"; last; } else { $mot = <LISTE_MOTS>; } } print "MOT SUIVANT : $mot\n\n"; print "Choisissez :\n"; print "------------\n\n"; for (my $i = 1; $i < @ARGV; $i++) { print "$i : envoyer vers le fichier $ARGV[$i]\n"; } print "i : ignorer le mot\n"; unless ($sauv) { # ne pas proposer l'option si on vient de sauvegarder print "s : sauvegarder le travail accompli jusqu'ici\n"; } print "q : quitter\n\n"; for (;;) { ReadMode 3; $touche = ReadKey; ReadMode 0; if ($touche eq "i") { # IGNORER $sauv = 0; last; } elsif ($touche eq "s") { # SAUVEGARDER if ($sauv) { # on vient d'effectuer une sauvegarde, alors beep... print "\a"; } else { print "Sauvegarde en cours... Patience...\n"; unless (open FICHIER_PROV, ">$ARGV[0]-prov") { print STDERR "repartmots: impossible de créer un fichier "; print STDERR "temporaire pour la sauvegarde !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "effectuée !\n"; exit (6); } unless (print FICHIER_PROV $mot) { print STDERR "repartmots: impossible d'écrire dans le fichier "; print STDERR "temporaire pour la sauvegarde !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "effectuée !\n"; exit (6); } while (<LISTE_MOTS>) { unless (print FICHIER_PROV $_) { print STDERR "repartmots: impossible d'écrire dans le fichier "; print STDERR "temporaire pour la sauvegarde !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "effectuée !\n"; exit (6); } } close LISTE_MOTS; close FICHIER_PROV; unless (rename "$ARGV[0]-prov", $ARGV[0]) { print STDERR "repartmots: impossible de remplacer le fichier "; print STDERR "$ARGV[0] original !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "complétement effectuée !\n"; print STDERR " Vous pouvez cependant utiliser le "; print STDERR "fichier $ARGV[0]-prov.\n"; exit (7); } unless (open LISTE_MOTS, $ARGV[0]) { print STDERR "repartmots: impossible de réouvrir le fichier "; print STDERR "$ARGV[0] !\n"; exit (8); } $sauv = 1; last; } } elsif ($touche eq "q") { # QUITTER if ($sauv) { # Sauvegarde effectuée, on quitte sans autre... for (my $i = 1; $i < @ARGV; $i++) { $fichier[$i]->close(); } close LISTE_MOTS; exit(0); } else { print "Désirez-vous effectuer une sauvegarde du travail accompli"; print " (o/n) ?\n"; while ($touche ne "o" && $touche ne "n") { ReadMode 3; $touche = ReadKey; ReadMode 0; } if ($touche eq "n") { exit(0); } else { print "Sauvegarde en cours... Patience...\n"; unless (open FICHIER_PROV, ">$ARGV[0]-prov") { print STDERR "repartmots: impossible de créer un fichier "; print STDERR "temporaire pour la sauvegarde !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "effectuée !\n"; exit (6); } unless (print FICHIER_PROV $mot) { print STDERR "repartmots: impossible d'écrire dans le fichier "; print STDERR "temporaire pour la sauvegarde !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "effectuée !\n"; exit (6); } while (<LISTE_MOTS>) { unless (print FICHIER_PROV $_) { print STDERR "repartmots: impossible d'écrire dans le fichier "; print STDERR "temporaire pour la sauvegarde !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "effectuée !\n"; exit (6); } } close LISTE_MOTS; close FICHIER_PROV; unless (rename "$ARGV[0]-prov", $ARGV[0]) { print STDERR "repartmots: impossible de remplacer le fichier "; print STDERR "$ARGV[0] original !\n"; print STDERR " La sauvegarde n'a pas pu être "; print STDERR "complétement effectuée !\n"; print STDERR " Vous pouvez cependant utiliser le "; print STDERR "fichier $ARGV[0]-prov.\n"; exit (7); } for (my $i = 1; $i < @ARGV; $i++) { $fichier[$i]->close(); } exit(0); } } } elsif (ord($touche) >= ord('1') && ord($touche) < ord('1') + @ARGV - 1) { $sauv = 0; $no_fichier = ord($touche) - ord('1') + 1; unless ($fichier[$no_fichier]->print($mot)) { print STDERR "repartmots: impossible d'écrire dans le fichier "; print STDERR "$ARGV[$no_fichier] !\n"; exit (5); } last; } else { # MAUVAISE TOUCHE print "\a"; } } } # Fermeture des fichiers for (my $i = 1; $i < @ARGV; $i++) { $fichier[$i]->close(); } close LISTE_MOTS; # ------------------------------------------------------------ sub ctrl_C { ReadMode 0; # au cas où le programme est arrêté brutalement, # on remet le terminal « en état » print STDERR "Traitement interrompu...\n"; exit (1); }