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 :

Récursivité et portée des varaiables


Sujet :

Langage Perl

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut Récursivité et portée des varaiables
    Bonjour,

    Je cherche à faire un script qui parcourt une arborescence de fichier et qui m'affiche le nom de la dernière "feuille" trouvée que ce soit un fichier ou un répertoire. Du coup je le fais de manière récursive mais j'ai un souci...
    voici mon code :
    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
    sub rglob{
    	$sNomRep = $_[0] ;
    	$sFlag = $_[1] ;
     
    	if($sFlag eq 1)
    	{
    		print "rep final : $sNomRep \n";
    	}
    	else
    	{
    		@tElt = glob($sNomRep."/*");
    		foreach $sElt (@tElt)
    		{
    			# on test si on est sur un rep
    			if(-d $sElt)
    			{
    				# on rappel le glob
    				&rglob( $sElt, 0);			
    			}
    			# on test si on est sur un fichier
    			if(-f $sElt)
    			{
    				print "fichier final : $sElt \n";
    			}
    		}
    		unless(@tElt)
    		{
    			# on rappel le glob en disant final
    			&rglob( $sNomRep, 1);			
    		}
    	}
    }
    Au premier passage, dans @tElt j'ai bien mes 4 répertoires et donc la fonction se rappelle avec le premier répertoire qui ne contient qu'un fichier, donc il arrive sur le test du fichier et il me dit "fichier final".
    Du coup il revient là où il était arrivé dans l'appel précédent, sauf que ma variable @tElt ne contient plus les 4 répertoires comme avant !!!
    Merci de votre aide.
    Jérôme

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    Ceci va t'imposer de déclarer @tElt, ce qui va t'imposer de choisir la portée dans laquelle cette variable sera déclarée et (my, our).

    En suite, j'aurais tendance à dire que @tElt peut être locale au "else" contenant le foreach.


    Enfin, je ne vois pas l'intérêt de l'appel final avec un flag spécial, je mets donc la condition de fin directement dans le else de "@tElt non vide".

    Ceci donne cela :
    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
     
    sub rglob{
    ($sNomRep) = @_;
     
    if (my @tElt = glob("$sNomRep."/*")) {
    	# on test si on est sur un rep
    	if(-d $sElt)
    	{
    		# on rappel le glob
    		rglob( $sElt, 0);			
    	}
    	# on test si on est sur un fichier
    	if(-f $sElt)
    	{
    		print "fichier final : $sElt \n";
    	}
    }
    else {
    	print "rep final : $sNomRep \n";
    }
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    Ceci va t'imposer de déclarer @tElt, ce qui va t'imposer de choisir la portée dans laquelle cette variable sera déclarée et (my, our).

    En suite, j'aurais tendance à dire que @tElt peut être locale au "else" contenant le foreach.
    Le pire c'est que je le savais... Merci !

    Citation Envoyé par Philou67430 Voir le message
    Enfin, je ne vois pas l'intérêt de l'appel final avec un flag spécial, je mets donc la condition de fin directement dans le else de "@tElt non vide".
    Tout à fait d'accord, je m'en étais rendu compte en l'écrivant...

    Merci pour tout !
    Jérôme

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Mais au fait, ça marche maintenant ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/02/2005, 09h05
  2. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  3. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05

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