laisso | [quotemsg=2245900,5,19304]Je n'ai pas testé l'ensemble, mais c'est l'idée.
Quelques remarques:
- éviter les print "\nCe programme parcourt toute l'arborescence d'un dossier que vous allez donner";
print "\nIl va afficher tous les fichiers et les sous-dossiers";
print "\nPour chaque fichier, on affichera le nom et la taille";
print "\nPour chaque fichier on recherche la correspondance d'un mot en début de ligne";
print "\nOn écrit le résultat dans le fichier Rapport.txt\n\n";
et utiliser plutôt ce style:
print "\nCe programme parcourt toute l'arborescence d'un dossier que vous allez donner\n";
print "Il va afficher tous les fichiers et les sous-dossiers\n";
print "Pour chaque fichier, on affichera le nom et la taille\n";
print "Pour chaque fichier on recherche la correspondance d'un mot en début de ligne\n";
print "On écrit le résultat dans le fichier Rapport.txt\n\n";
Ce n'est peut être pas important en Perl, mais il y a pas mal de langages ou le fait d'avoir un \n en fin de texte a afficher est significatif (ie déclenche l'affichage).
- my $D= shift @_; a remplacer par my $D= shift;
C'est la même chose, mais c'est la pratique courante, de ne pas écrire les variables implicites quand c'est évident.
idem ici:
while (my $ligne = <$FH_IN> ) { # lecture du fichier courant
if ( $ligne =~ /^$M/ ) { # recherche du motif en début de ligne
print $FH_OUT "$ligne";
}
la pratique pour ce genre de boucle simple serait plutôt d'écrire
while (<$FH_IN> ) { # lecture du fichier courant
if ( /^$M/ ) { # recherche du motif en début de ligne
print $FH_OUT $_;
}
avec la variable implicite $_
- d'autre part, réserver les majuscules aux variables globales: $FH_IN -> $fh_in
opendir (REP,$D) or die ("Impossible d'ouvrir le repertoire ",$D);
# On recupere les fichiers du descripteur REP dans @listFile
# Notez bien que @listFile peut contenir à la fois des dossiers et des fichiers
my @listFile = readdir (REP);
# on ferme le descripteur
close (REP);
Primo, l'erreur: ça doit être closedir et non pas close.
D'autre part, aucune raison de ne pas utiliser des variables locales:
opendir (my $rep, $D) or die ("Impossible d'ouvrir le repertoire ",$D);
# On recupere les fichiers du descripteur $rep dans @listFile
# Notez bien que @listFile peut contenir à la fois des dossiers et des fichiers
my @listFile = readdir ($rep);
# on ferme le descripteur
closedir ($rep);
- plutôt que faire un test complexe elsif (-d $nomComplet and $_ ne "." and $_ ne ".." )
autant éliminer . et .. a la source:
my @listFile = grep !/^\.{1,2}$/o, readdir ($rep);
- enfin
foreach (@listFile) {
# Création du nom complet :
my $nomComplet = $D."/".$_;
# S'il s'agit d'un fichier on le traite via la fonction de traitement
if (-f $nomComplet) {
traitement($nomComplet);
}
# sinon s'il s'agit d'un dossier autre que les dossiers . et ..
elsif (-d $nomComplet) {
# ... on lance un nouvel appel récursif à notre fonction, sur ce dossier là :
AnalyseDossier ($nomComplet);
}
}
un elseif pas suivi de else, j'aime pas.
Ce serait plus simple ainsi:
foreach (@listFile) {
# Création du nom complet :
my $nomComplet = $D."/".$_;
# S'il s'agit d'un fichier on le traite via la fonction de traitement
if (-f $_) {
traitement($nomComplet);
next;
}
# sinon s'il s'agit d'un dossier autre que les dossiers . et ..
if (-d $_) {
AnalyseDossier ($nomComplet);
next;
}
}
et c'est probablement plus optimisé en faisant if (-d _) (après un premier test de fichier -f, -d, ... la variable _ contient les infos relatives au fichier, pour être réutilisée avec d'autres tests de fichier, sinon, chaque test fait un appel système fstat ou stat, ce qui est plus long)
- pensez aussi à utiliser use autodie;
ce qui permet de remplacer
open my $FH_OUT, '>:utf8', './Rapport.txt' or die "ouverture impossible de Rapport.txt $!"; # ouverture du fichier rapport
par
open my $FH_OUT, '>:utf8', './Rapport.txt';
(bon, vérifier quand même en quelle langue sera le message d'erreur automatique dans ce dernier cas)
Bonjour,
Voici la modification, Seulement voila le fichier . txt ne se génére pas prq?
Code :
- #!/usr/bin/perl
- use strict;
- use warnings;
- use utf8;
- use autodie;
- ######*PROGRAMME PRINCIPAL ######
- print "\nCe programme parcourt toute l'arborescence d'un dossier que vous allez donner\n";
- print "Il va afficher tous les fichiers et les sous-dossiers\n";
- print "Pour chaque fichier, on affichera le nom et la taille\n";
- print "Pour chaque fichier on recherche la correspondance d'un mot en début de ligne\n";
- print "On écrit le résultat dans le fichier Rapport.txt\n\n";
- # saisie
- print "\n\nQuel dossier ? Entrez le nom complet\n";
- my $D = <STDIN>;
- chomp $D;
- print "\n\nEntrez le mot recherché :\n";
- my $M = <STDIN>;
- chomp $M;
- print "$D - $M\n";
- open my $FH_OUT, '>:utf8', './Rapport.txt'; # ouverture du fichier rapport
- print $FH_OUT date();
- print $FH_OUT "\nDossier : $D - Mot recherché : $M\n\n";;
- # traitement
- if (-d $D) {
- AnalyseDossier ($D);
- }
- else {
- die ("Impossible d'ouvrir le repertoire ",$D);
- }
- close $FH_OUT;
- print "\n\nAu revoir !\n\n";
- sub AnalyseDossier {
- # La fonction analyseDossier attend un seul paramètre qui est le nom du dossier qu'on veut analyser
- my $D= shift; # On recupere le nom du dossier...
- # ouverture du dossier $D et creation du descripteur REP
- opendir (my $rep, $D) or die ("Impossible d'ouvrir le repertoire ",$D);
- # On recupere les fichiers du descripteur REP dans @listFile
- # Notez bien que @listFile peut contenir à la fois des dossiers et des fichiers
- my @listFile = grep !/^\.{1,2}$/o, readdir ($rep);
- # on ferme le descripteur
- closedir ($rep);
- # Parcours des éléments du dossier $D, ils peuvent $etre des fichiers ou des dossiers
- foreach (@listFile) {
- # Création du nom complet :
- my $nomComplet = $D."/".$_;
- # S'il s'agit d'un fichier on le traite via la fonction de traitement
- if (-f $_) {
- traitement($nomComplet);
- next;
- }
- # sinon s'il s'agit d'un dossier autre que les dossiers . et ..
- if (-d $_) {
- # ... on lance un nouvel appel récursif à notre fonction, sur ce dossier là :
- AnalyseDossier ($nomComplet);
- next;
- }
- } # fin de foreach (@listFile)
- } # fin de fonction analyseDossier
- sub traitement {
- # Ici on se contente d'afficher le nom du fichier et sa taille
- # On récupère le paramètre passé à la fonction traitement :
- my $nomComplet = shift @_; # c'est le nom complet du fichier
- my $taille = -s ($nomComplet);
- print $FH_OUT "\n\n$nomComplet : $taille\n";
- open my $fh_in, "<:utf8", $nomComplet or die "ouverture impossible de $nomComplet $!"; # ouverture du fichier courant en lecture
- while ( <$fh_in> ) { # lecture du fichier courant
- if ( /^$M/ ) { # recherche du motif en début de ligne
- print $FH_OUT $_;
- }
- }
- close $fh_in; # la fermeture du handle
- } # fin de fonction traitement
- ###############
- # Date et Heure
- sub date {
- my $time = shift || time; #$time par defaut vaut le time actuel
- my ( $seconde, $minute, $heure, $jour, $mois, $annee, $jour_semaine, $jour_annee, $heure_hiver_ou_ete )
- = localtime($time);
- $mois += 1;
- $annee += 1900;
- # On rajoute 0 si le chiffre est compris entre 1 et 9
-
- foreach ( $seconde, $minute, $heure, $jour, $mois, $annee ) { s/^(\d)$/0$1/; }
- return "Le $jour/$mois/$annee à $heure:$minute:$seconde";
- }
|
Message édité par laisso le 13-12-2014 à 00:21:07
|