Etape N°6
Ecrire un programme Perl qui lit un texte passé en paramètre et en fait des dictionnaires alphabétiques et par occurence. On pourra utiliser le fichier debcand.txt qui contient le début du texte de Candide par Voltaire pour tester ce programme.
Resultat
Le code :
#!usr/local/bin/perl
my $entree="$ARGV[0]";
## compter les lignes
open (FILE, "$entree");
$compteurtotal = 0;
$compteurlignesblanches = 0;
while ($ligne = <FILE>)
{
if ($ligne =~ /^$/ ) {$compteurlignesblanches ++}
$compteur ++;}
$compteurligne = $compteur - $compteurlignesblanches;
print "Le fichier $entree contient $compteurligne lignes \n";
close FILE;
## compter les mots
open (FILE, "$entree");
while ($ligne = <FILE>)
{
chomp $ligne;
$ligne = lc ($ligne);
###séparation en mots par ¤
$ligne=~ s/ /¤/g;
$ligne=~ s/\./¤/g;
$ligne=~ s/;/¤/g;
$ligne=~ s/,/¤/g;
$ligne=~ s/:/¤/g;
$ligne=~ s/-/¤/g;
$ligne=~ s/\(/¤/g;
$ligne=~ s/\)/¤/g;
$ligne=~ s/!/¤/g;
$ligne=~ s/«/¤/g;
$ligne=~ s/»/¤/g;
$ligne=~ s/^$//g;
if ($ligne =~ /¤[a-zA-Z]{1,2}'/)
{$ligne =~ s/'/¤/g;} ## compte l'apostrophe comme séparateur de mots si ce qui précède ne dépasse pas deux lettres,
# comme le s', le l', ..., mais garde entr'ouvrir, aujourd'hui, quelqu'un par ex, (PARTI PRIS)
$textecomplet = $textecomplet.$ligne."¤";
}
close (FILE);
$textecomplet=~ s/¤(¤)*/¤/g;
$textecomplet=~ s/ //g;
chomp $textecomplet;
@mots= split (/¤/,$textecomplet);
$#mots ++;
print "On y compte $#mots mots au total ";
foreach $mot (@mots)
{
$diff{$mot} = $diff{$mot} + 1 ;
}
@nbdiff =();
@nbdiff = keys (%diff); # on crée une liste des clés de la table de hachage
$#nbdiff ++; # on récupère le nombre de lignes de la liste (+1 car la première vaut 0)
print " dont $#nbdiff différents \n";
### dictionnaire par ordre alphabétique
$dic_mot = "dic_debcand_mot.html";
open (FILEOUT, ">>$dic_mot");
@liste_mots = keys (%diff);
@motstries = sort (@liste_mots);
print FILEOUT "<HTML>\n";
print FILEOUT "<HEAD><TITLE>Occurences</TITLE></HEAD>\n";
print FILEOUT "<BODY>";
print FILEOUT "<CENTER><TABLE width=60% border=1>" ;
foreach $eltri (@motstries)
{
print FILEOUT "<TR><TD> $eltri </TD><TD> $diff{$eltri} </TD></TR>";
}
print FILEOUT "</TABLE>";
print FILEOUT "</BODY>\n";
print FILEOUT "</HTML>\n";
close FILEOUT;
print "Vous trouverez à l'emplacement $dic_mot le dictionnaire de ses occurences classées par ordre alphabétique\n";
### dictionnaire par fréquence d'occurences
$dic2 = "dic_debcand_occ.html";
open (FILEOUT2, ">>$dic2");
print FILEOUT2 "<HTML>\n";
print FILEOUT2 "<HEAD><TITLE>Occurences</TITLE></HEAD>\n";
print FILEOUT2 "<BODY>";
print FILEOUT2 "<CENTER><TABLE width=60% border=1>" ;
@liste_mots = keys (%diff);
foreach $eltri ( sort { ($diff{$b} <=> $diff{$a} ) or ($a cmp $b) } @liste_mots)
{
print FILEOUT2 " <TR><TD>$eltri </TD><TD> $diff{$eltri} </TD></TR>";
}
print FILEOUT2 "</TABLE>";
print FILEOUT2 "</BODY>\n";
print FILEOUT2 "</HTML>\n";
close FILEOUT2;
print "Vous trouverez à l'emplacement $dic_mot le dictionnaire de ses occurences classées par fréquence d'occurences\n";
Affichage :
Les fichiers : dictionnaire_alphabétique
Haut de page