#! /usr/bin/perl -w # Ce programme permet de comparer deux listes de mots : il écrit dans un # troisième fichier les mots présents dans la seconde liste mais absents # de la première. # # Syntaxe : dansdico liste1 liste2 resultat # # IMPORTANT : les deux listes doivent avoir été préalablement triées selon # l'ordre des caractères spécifiques au système d'exploitation (si ce n'est # pas le cas, des résultats abérants seront produits). Un peu moyen # d'effectuer cette opération est d'utiliser la commande 'sort' comme suit : # # sort liste1 > prov; mv prov liste1 # sort liste2 > prov; mv prov liste2 # # Faire une copie de sécurité des deux listes n'est pas un luxe. # Si vous avez un doute sur l'ordre de tri, faites tourner le programme sur # la même liste ('dansdico liste1 liste1 resultat'). Si la taille du fichier # 'resultat' est non-nulle, il y a un problème. Essayez un autre programme # de tri. use strict; my($MotListe1, $MotListe2); # Vérification de la syntaxe unless (@ARGV == 3) { print STDERR "dansdico: SYNTAXE : dansdico liste1 liste2 resultat\n"; exit (1); } # Ouverture des fichiers unless (open (LST1, $ARGV[0])) { print STDERR "dansdico: Impossible d'ouvrir le fichier $ARGV[0] !\n"; exit (2); } unless (open (LST2, $ARGV[1])) { print STDERR "dansdico: Impossible d'ouvrir le fichier $ARGV[1] !\n"; close (LST1); exit (2); } unless (open (RSLT, ">$ARGV[2]")) { print STDERR "dansdico: Impossible de créer le fichier $ARGV[2] !\n"; close (LST1); close (LST2); exit (2); } # Vérifions que les fichiers ne soient pas vides if (eof LST1) { print STDERR "dansdico: Le fichier $ARGV[0] est vide !\n"; exit (3); } if (eof LST2) { print STDERR "dansdico: Le fichier $ARGV[1] est vide !\n"; exit (3); } # Procédure de comparaison (voir le répertoire 'docs' pour l'algorithme) $MotListe1 = <LST1>; TEST: for (;;) { if (eof LST2) { last; } $MotListe2 = <LST2>; while ($MotListe1 lt $MotListe2) { if (eof LST1) { until (eof LST2) { print RSLT <LST2>; } last TEST; } $MotListe1 = <LST1>; } if ($MotListe1 eq $MotListe2) { if (eof LST1) { until (eof LST2) { print RSLT <LST2>; } last; } $MotListe1 = <LST1>; next; } print RSLT $MotListe2; } close (LST1); close (LST2); close (RSLT); exit (0);