IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

perl et recursivité


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut perl et recursivité
    bonjour, je suis en train de me battre avec un script perl pour parcourir mon arborescence et faire un traitement sur les images en feuille ( je vous passe le traitement).


    Donc voila, premiere branche de l'arborescence c'est ok, mais apres il ne remonte pas et s'arrete au bout de la premiere branche!!!, Je vois pas trop le soucis, est ce que perl est particulier a gerer au niveau recursivite, ou ai-je fais une grosse boulette.

    je transmet le script (assez court)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/usr/bin/perl
     
    sub parcours
    {
    #recup du chemain absolu
    $rep_courant=$_[0];
    print $rep_courant."\n";
     
     
    #ouverture du repertoire, et listage
    opendir(DIR,$rep_courant) || die "erreur de ouf";
    @liste = readdir(DIR);
    $nbelem=scalar(@liste);
    $i=0;
    $trouve=0;
     
     
    #tant qu'on a pas tout parcouru ou qu'on a pas trouve une image
    while(($i<$nbelem)and($trouve == 0)){
    	$rep="/".$liste[$i];
     
     
    	#on creer le nouveau chemin absolu
    	$rep_en_traitement=$rep_courant.$rep;
     
    	#print "\$rep_courant = $rep_courant\n";
    	#print "\$rep = $rep\n";
    	#print "\$rep_en_traitement = $rep_en_traitement\n";
     
     
    	#si rep "." ou ".." on fait rien
    	if(($rep =~ /.*\.$/)){
    		print "test2 ** $rep_en_traitement **\n";
    	}else{
    		#sinon
    		#si c'est une image alors je traite toute les images du repertoire
    		print" test3\n";
    		if($rep =~ /.*jpg$/){
    			$trouve=1;
    			print "IIIAAAHHH je m'occupe des fichiers images du repertoire $rep_courant\n";
    		}
    		#si c'est un repertoire je descend d'un cran et je recommence
    		if(-d $rep_en_traitement){	
    			&parcours($rep_en_traitement);
    		}
    	}
    	$i++;
    	print "\$i =$i et \$trouve = $trouve\n";
    }
    }
     
    #je commence a l'endroit du script
    $working_dir=`pwd`;
    chop($working_dir);
    &parcours($working_dir);
    j'ajoute ma trace d'execution si ca peut aider...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [ecreach@ird-us025-ddag qlook]$ ./script2.pl
    /mnt/data/qlook
    /. est .
    test2 ** /mnt/data/qlook/. **
    $i =1 et $trouve = 0
     test3
    $i =2 et $trouve = 0
     test3
    $i =3 et $trouve = 0
     test3
    /mnt/data/qlook/QLOBSSAT
    /. est .
    test2 ** /mnt/data/qlook/QLOBSSAT/. **
    $i =1 et $trouve = 0
     test3
    /mnt/data/qlook/QLOBSSAT/SSTTMI1D
    /. est .
    test2 ** /mnt/data/qlook/QLOBSSAT/SSTTMI1D/. **
    $i =1 et $trouve = 0
     test3
    /mnt/data/qlook/QLOBSSAT/SSTTMI1D/2005
    /. est .
    test2 ** /mnt/data/qlook/QLOBSSAT/SSTTMI1D/2005/. **
    $i =1 et $trouve = 0
     test3
    /mnt/data/qlook/QLOBSSAT/SSTTMI1D/2005/ATT
     test3
    IIIAAAHHH je m'occupe des fichiers images du repertoire /mnt/data/qlook/QLOBSSAT/SSTTMI1D/2005/ATT
    $i =1 et $trouve = 1
    $i =2 et $trouve = 1
    $i =3 et $trouve = 1
    $i =4 et $trouve = 1
    $i =5 et $trouve = 1

    Si quelqu'un qui s'y connais un tit peu perl pouvait m'aider ce serait super sympa.

    Merci

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    L'usage des "pragma" strict et warnings peut grandement aider.

    En l'occurrence, n'ayant pas restreint la portée de tes variables, au moyen d'un my ou d'un local, celles-ci sont globales, ce qui pose un petit problème au concept même de récursivité : les données d'un niveau de récursion sont altérées par le niveau suivant.

    L'ajout d'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings
    en début de script te forcera a déclarer toutes tes variables, et ainsi à en restreindre la portée à la zone utile. Ainsi, plus d'effet de bord, d'une itération à l'autre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut impec
    merci beaucoup, je vais essayer ca. et c'est bon ca marche.

    Encore une victoire de canard!!!!

    et bravo pour tout les modos de developpez.com, car le temps de reaction est vraiment super rapide

  4. #4
    Membre averti
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Par défaut
    bonjour,

    J'ai étudié ton code et j'ai rajouté une variable retour qui renvoie la concaténation de l'arborescence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    sub parcours
    {
    	#recup du chemain absolu
    	my $rep_courant=$_[0];
    	my $test = $_[1];
     
    	if($rep_courant ne $path) {
    		print $rep_courant.'<br>';
    	}
     
    	#ouverture du repertoire, et listage
    	opendir(DIR,$rep_courant) || die "erreur de ouf";
    	my @liste = readdir(DIR);
    	my $nbelem=scalar(@liste);
    	my $i=0;
    	my $trouve=0;
    	my $indide=0;
     
    	#tant qu'on a pas tout parcouru ou qu'on a pas trouve un fichier XML
    	while(($i<$nbelem)and($trouve == 0)){
    		$rep="/".$liste[$i];		
    		#on creer le nouveau chemin absolu
    		$rep_en_traitement=$rep_courant.$rep;	
    		#si rep "." ou ".." on fait rien
    		if(!($rep =~ /.*\.$/)){	
    			if($rep =~ /.xml/){
    				$trouve=1;
    				print "<span>IIIAAAHHH je m'occupe des fichiers images du repertoire $rep_courant</span><br>";
    			}
    			#si c'est un repertoire je descend d'un cran et je recommence
    			if(-d $rep_en_traitement){
    				$test = $rep_en_traitement.' | '.&parcours($rep_en_traitement,$test);
     
    			}
    		}
    		$i++;
     
    	}
    	return $test;
    }
    appel par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    $retour = &parcours($path,'');
    voila

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Test de recursivité perl => plantage PC
    Par sliderman dans le forum Langage
    Réponses: 1
    Dernier message: 26/09/2008, 08h28
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. [langage] Inclure de perl en c !!!
    Par ryo00 dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2002, 10h03
  4. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo