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 :

Problème commande do dans boucle foreach


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Problème commande do dans boucle foreach
    bonjour,
    Je suis tout nouveau dans le monde de la programmation. Je dois réaliser un programme qui va llire un repertoire contenant des fichiers, créer un dossier à partir du nom de chaque fichiers contenus dans le répertoire, puis déplacer le fichier dans le dossier correspondant avant d'effectuer sur ce fichier un script perl (en l'occurence make_raw_envi.pl nom du fichier)

    Le problème est qu'il n'effectue qu'une seule boucle et il ne la termine même pas. Il exécute bien le fichier perl (make_raw_envi.pl) mais après il s'arrête.

    Quelqu'un aurait-il une solution ?????

    voici le code :

    opendir ( REP , $ARGV[0] ) || die "Erreur d'ouverture du repertoire $ARGV[0]";

    $dir = $ARGV[0];

    #Lecture du répertoire et affectation du répertoire sous REP.
    #Affichage à l'écran du contenu du répertoire sous la forme d'une liste.

    @file = readdir ( REP );

    print "\nContenu du repertoire : \n";

    foreach $f (@file) {

    print "\n$f\n";

    }

    #Recherche du chemin complet du répertoire de travail et affectation à la variable $hdir.
    #Après lecture du répertoire, il faut entrer de celui-ci pour effectuer la création de dossiers.

    #use Cwd;

    #$hdir = getcwd();

    #$ch = "$hdir/$dir";

    chdir $dir || die "Erreur dans le changement de repertoire de travail";

    #Pour tout les fichiers contenus dans le répertoire, il y a création de la chaîne de
    #caractère $h (YYMMDD) qui correspond au nom du futur dossier. Après avoir créer le dossier,
    #il faut déplacer le fichier correspondant en renommant le chemin d'accès.

    foreach my $f (@file) {

    if ( -f $f ) {

    $h = substr($f,16,6);

    mkdir ($h) || die "\nCreation du dossier $f impossible";

    rename ("$dir/$f","$dir/$h/$f") || die "\nImpossible de deplacer le fichier $h";


    chdir "$h" || die "Erreur dans le changement de repertoire";

    do `make_raw_envi.pl $f`;
    }
    }


    Merci d'avance....

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 587
    Points : 2 036
    Points
    2 036
    Par défaut
    Bonjour,

    peux-tu utiliser les balises # et y glisser ton code à l'intérieur stp ?

    Ce sera plus facile à lire pour nous autres, merci

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Rectificatif
    Désolé, je ne connaissais pas.


    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #!/bin/perl 
     
    #Ce petit programme a pour but de préparer les images ENVISAT ASAR 
    #pour ROI_PAC. A partir d'un répertoire contenant toutes les images 
    #brutes, il génère un dossier pour chaque image et déplace cette dernière 
    #dans le dossier correspondant. Puis, il effectue la première étape 
    #du traitement sous ROI_PAC, à savoir : make_raw_envi.pl. 
     
     
    print "\n		-------------------------------------------\n\n"; 
    print "\n			Pre-Traitement ENVISAT-ASAR\n\n"; 
    print "\n		-------------------------------------------\n\n"; 
     
     
     
    #Affichage à l'écran du répertoire de travail.
     
    print "\nRepertoire de travail : $ARGV[0]\n";
     
    #Ouverture du répertoire et réaffectation de la variable d'entrée. 
     
    opendir ( REP , $ARGV[0] ) || die "Erreur d'ouverture du repertoire $ARGV[0]"; 
     
    $dir = $ARGV[0]; 
     
    #Lecture du répertoire et affectation du répertoire sous REP.
    #Affichage à l'écran du contenu du répertoire sous la forme d'une liste.
     
    @file = readdir ( REP );
     
    print "\nContenu du repertoire : \n";
     
    foreach $f (@file) {
     
    		print "\n$f\n";
     
    }
     
    #Recherche du chemin complet du répertoire de travail et affectation à la variable $hdir.
    #Après lecture du répertoire, il faut entrer de celui-ci pour effectuer la création de dossiers. 
     
    #use Cwd; 
     
    #$hdir = getcwd(); 
     
    #$ch = "$hdir/$dir"; 
     
    chdir $dir || die "Erreur dans le changement de repertoire de travail"; 
     
    #Pour tout les fichiers contenus dans le répertoire, il y a création de la chaîne de
    #caractère $h (YYMMDD) qui correspond au nom du futur dossier. Après avoir créer le dossier,
    #il faut déplacer le fichier correspondant en renommant le chemin d'accès.
     
    foreach my $f (@file) { 
     
    	if ( -f $f ) { 
     
    		$h = substr($f,16,6); 
     
    		mkdir ($h) || die "\nCreation du dossier $f impossible";
     
    		rename ("$dir/$f","$dir/$h/$f") || die "\nImpossible de deplacer le fichier $h";
     
     
    		chdir "$h" || die "Erreur dans le changement de repertoire";
     
    		eval `make_raw_envi.pl $f` || next;
     
    	}
    }

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 587
    Points : 2 036
    Points
    2 036
    Par défaut
    Merci

    2 p'tites recommandations :

    1) utilise les pragmas strict et warnings, ça t'aidera d'une part à faire du code propre et d'autre part à le rendre moins sujet à bugs.

    2) désactive l'eval dans ton code et regarde si le traitement va bien jusqu'à la fin

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Correction 1
    J'ai ajouté les pragmas strict et warning, ainsi, lors de la compilation, il y avait des erreurs.

    Merci pour les conseils...

    Ensuite j'ai mis de coté la partie eval et chdir, et le programme tourne correctement, mais lorsque que je rajoute le chdir, il effectue la boucle une seule fois.

    Je pense cela doit venir du fait des pragmas. Je vais continuer à chercher.

    Merci d'avance....


    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #!/bin/perl 
     
    #Ce petit programme a pour but de préparer les images ENVISAT ASAR 
    #pour ROI_PAC. A partir d'un répertoire contenant toutes les images 
    #brutes, il génère un dossier pour chaque image et déplace cette dernière 
    #dans le dossier correspondant. Puis, il effectue la première étape 
    #du traitement sous ROI_PAC, à savoir : make_raw_envi.pl.
     
    use strict;
    use warnings; 
     
     
    print "\n		-------------------------------------------\n\n"; 
    print "\n			Pre-Traitement ENVISAT-ASAR\n\n"; 
    print "\n		-------------------------------------------\n\n"; 
     
     
     
    #Affichage à l'écran du répertoire de travail.
     
    print "\nRepertoire de travail : $ARGV[0]\n";
     
    #Ouverture du répertoire et réaffectation de la variable d'entrée. 
     
    opendir ( REP , $ARGV[0] ) || die "Erreur d'ouverture du repertoire $ARGV[0]"; 
     
    my $dir = $ARGV[0]; 
     
    #Lecture du répertoire et affectation du répertoire sous REP.
    #Affichage à l'écran du contenu du répertoire sous la forme d'une liste.
     
    my @file = readdir ( REP );
     
    print "\nContenu du repertoire : \n";
     
    foreach my $f (@file) {
     
    		print "\n$f\n";
     
    }
     
    #Recherche du chemin complet du répertoire de travail et affectation à la variable $hdir.
    #Après lecture du répertoire, il faut entrer de celui-ci pour effectuer la création de dossiers. 
     
    #use Cwd; 
     
    #$hdir = getcwd(); 
     
    #$ch = "$hdir/$dir"; 
     
    chdir $dir || die "Erreur dans le changement de repertoire de travail"; 
     
    #Pour tout les fichiers contenus dans le répertoire, il y a création de la chaîne de
    #caractère $h (YYMMDD) qui correspond au nom du futur dossier. Après avoir créer le dossier,
    #il faut déplacer le fichier correspondant en renommant le chemin d'accès.
     
    foreach my $f (@file) { 
     
    	if ( -f $f ) { 
     
    		my $h = substr($f,16,6); 
     
    		mkdir ($h) || die "\nCreation du dossier $f impossible";
     
    		rename ("$dir/$f","$dir/$h/$f") || die "\nImpossible de deplacer le fichier $h";
     
     
    #		chdir "$h" || die "Erreur dans le changement de repertoire";
     
    #		eval `make_raw_envi.pl $f` || next;
     
    	}
    }

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 587
    Points : 2 036
    Points
    2 036
    Par défaut
    Citation Envoyé par jchampen Voir le message
    J'ai ajouté les pragmas strict et warning, ainsi, lors de la compilation, il y avait des erreurs.

    Merci pour les conseils...

    Ensuite j'ai mis de coté la partie eval et chdir, et le programme tourne correctement, mais lorsque que je rajoute le chdir, il effectue la boucle une seule fois.

    Je pense cela doit venir du fait des pragmas. Je vais continuer à chercher.

    Merci d'avance....
    Si tu parles du chdir juste avant eval, c'est normal car chdir te fait rentrer dans le répertoire au 1er passage de ta boucle foreach, mais comme jamais tu ne ressors de ce répertoire...

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

Discussions similaires

  1. Probléme commande shell dans script perl
    Par ApocalypseDuck dans le forum Langage
    Réponses: 2
    Dernier message: 08/04/2009, 18h54
  2. [2005] Data Flow dans boucle Foreach
    Par JB_paris dans le forum SSIS
    Réponses: 4
    Dernier message: 23/01/2009, 09h23
  3. Insérer puces (UL-LI) dans boucle foreach PHP
    Par RENAUDER dans le forum Langage
    Réponses: 1
    Dernier message: 21/01/2009, 12h18
  4. Problème avec variable dans boucle DO WHILE
    Par bandit_debutant dans le forum Langage
    Réponses: 13
    Dernier message: 25/02/2008, 17h34
  5. Problème de variable dans un foreach
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/05/2006, 17h57

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