Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Prob recursivité

3 réponses
Avatar
Orion93
Bonjour,

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!

3 réponses

Avatar
Nicolas Chuche
(Jean-Yves Bernier) disait que :

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
}
}
Avatar
Paul GABORIT
À (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é :


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;

foreach (@files) {
if (-d "$dir/$_) {
push @dirs, "$dir/$_";
} else {
# traitement du fichier "$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/>

Avatar
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.