Maintenant mon script fonctionne bien (j'utilise un grep plutot qu'un glob)
mais je n'arrive toujours pas a le faire fonctionne sur toute une
arborescence d'un coup. Je sais qu'il faut utiliser le principe de
recursivité mais ca me depasse completement!
Ce que je voudrais c'est rentrée le dossier c:\toto\ et qu'il aille compter
le nbre de ligne de tous les fichiers ayant l'extension toto1 se trouvant
dans l'arborescence dependant de toto.
Pourriez vous m'indiquez le principe ou la fonction a utiliser.
Voici mon script actuel:
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
use diagnostics;
use Tk::Entry;
my $main = MainWindow -> new;
$main -> title("Test 1");
$main -> Label(-text=>"Chemin:")->pack();
my $toto = $main -> Entry()->pack(-padx=>5);
$main -> Label(-text=>"Extension:")->pack();
my $toto1 = $main -> Entry(-width=>4)->pack(-padx=>5);
$main -> Label(-text=>'Le résultat se trouve sur c:\result.txt')->pack(-
side=>'bottom',-pady=>1);
$main->Button(-text=>'Ok',-command=>\&recupPages)->pack(-side=>'left',
expand=>1,-pady=>5);
$main->Button(-text=>'Fermer',-command=>sub {exit;})->pack(-side=>'right',
expand=>1,-pady=>1);
MainLoop();
sub recupPages
{
## Recupere le donnees du champ
my $dir=$toto->get();
my $ext=$toto1->get();
## Cree une liste des fichiers finissant par le champ extension
opendir(DIR,$dir) or die "$!\n";
my @files = grep { /\.$ext$/ } readdir( DIR );
closedir( DIR );
## Processe pour chaqu'un des fichiers
foreach (@files) {
open (SORTIE,">> c:\\result.txt");
open(PL,"$dir/$_") or die "$!\n";
my @lines = <PL>;
close(PL);
print SORTIE "Dossier: $dir Fichier: $_ ".@lines." \n";
}
}
PS: Merci a Paul Gaborit pour son aide passé et ses conseils!
Et puis on se dit qu'on doit pouvoir passer le critére de reconnaissance des fichiers à traiter ainsi que la routine de traitement elle-même comme paramètres à 'recup_pages'... Et on se dit que 'recup_pages' n'est peut être pas le bon nom. Et on tombe en arrêt devant File::Find qui fait exactement cela ;-)
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Tue, 24 Feb 2004 11:51:23 +0100,
Nicolas Chuche <nchuche@teaser.fr> écrivait (wrote):
Houla, ça sent le c-iste ça ! En perl on écrirait plutôt la boucle
comme ça :
foreach (@files) {
if (-d "$dir/$_) {
recupPages ("$dir/$_");
} else {
# si extension reconnue, compter les lignes
}
}
Et on peut habiller l'ensemble pour éviter la récursivité :
sub recup_pages {
my @dirs = (shift);
while (@dirs) {
my $dir = pop @dirs;
opendir my $dirh, $dir
or die "'$dir' illisible : $!n";
my @files = readdir $dir;
closedir $dir;
Et puis on se dit qu'on doit pouvoir passer le critére de reconnaissance des
fichiers à traiter ainsi que la routine de traitement elle-même comme
paramètres à 'recup_pages'... Et on se dit que 'recup_pages' n'est peut être
pas le bon nom. Et on tombe en arrêt devant File::Find qui fait exactement
cela ;-)
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
Et puis on se dit qu'on doit pouvoir passer le critére de reconnaissance des fichiers à traiter ainsi que la routine de traitement elle-même comme paramètres à 'recup_pages'... Et on se dit que 'recup_pages' n'est peut être pas le bon nom. Et on tombe en arrêt devant File::Find qui fait exactement cela ;-)
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
Jean-Michel Hiver
Paul GABORIT wrote:
À (at) Tue, 24 Feb 2004 11:51:23 +0100, Nicolas Chuche écrivait (wrote):
Houla, ça sent le c-iste ça ! En perl on écrirait plutôt la boucle comme ça :
foreach (@files) { if (-d "$dir/$_) { recupPages ("$dir/$_"); } else { # si extension reconnue, compter les lignes } }
Et on peut habiller l'ensemble pour éviter la récursivité :
Ou alors utiliser File::Find qui est ecrit *exactement* pour ce genre de choses et qui fait partie de la distrib Perl.
Paul GABORIT wrote:
À (at) Tue, 24 Feb 2004 11:51:23 +0100,
Nicolas Chuche <nchuche@teaser.fr> écrivait (wrote):
Houla, ça sent le c-iste ça ! En perl on écrirait plutôt la boucle
comme ça :
foreach (@files) {
if (-d "$dir/$_) {
recupPages ("$dir/$_");
} else {
# si extension reconnue, compter les lignes
}
}
Et on peut habiller l'ensemble pour éviter la récursivité :
Ou alors utiliser File::Find qui est ecrit *exactement* pour ce genre de
choses et qui fait partie de la distrib Perl.