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 :

Instruction du type "dés que"?


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Par défaut Instruction du type "dés que"?
    Salut,

    J'ai une liste de plusieurs fichiers logs et je voudrais ne garder que ceux qui contiennent $info.
    J'ai fait le bout de code suivant, mais ca ne fonctionne pas.
    Existe-t-il une instruction du type "dés que", genre "dés que j'ai trouvé $info dans $lf, je m'arrête de le parser, je le stocke sous @result_files et je passe au log $lf suivant. Si je ne trouve pas $info dans $lf alors je le stocke sous @tobedeleted".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    foreach $lf (@l_files){
    		open(FI,"<$lf") or die ("Impossible to open the file $_.\n");
    		while ( my @l = <FI> ) {
    			foreach $l (@l){
    				if ($l =~ /$info/i) {
    					push (@result_files, $lf);
    				} else {
    					push (@tobedeleted, $lf);
    				}
    			}
    		}
    		close FI;
    	}
    par avance merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 167
    Par défaut
    Peut-être un last peut résoudre ton problème, last fait sortir immédiatement de la boucle la plus interne, ici, il faut sortir de 2 boucles, il faut dans ce cas étiqueter la boucle dont on veut sortir, voici donc le code que je propose :
    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
    foreach $lf (@l_files){
    		open(FI,"<$lf") or die ("Impossible to open the file $_.\n");
                    todelete=1 ;
    		OUTER:while ( my @l = <FI> ) {
    			foreach $l (@l){
    				if ($l =~ /$info/i) {
    					push (@result_files, $lf);
                                            todelete=0 ;
                                            last  OUTER ;
    				} 
    		      }
    	      }
    	      close FI;
                  if(todelete) {
                     push (@tobedeleted, $lf);
                  }
    }
    Je ne comprend pas pourquoi chaque fichier est lu en entier dans le tableau @l, personnelllement, je le lirais ligne par ligne. ce qui donnerait :
    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
    foreach $lf (@l_files){
    		open(FI,"<$lf") or die ("Impossible to open the file $_.\n");
                    todelete=1 ;
    		while ( my $l = <FI> ) {			
    				if ($l =~ /$info/i) {
    					push (@result_files, $lf);
                                            todelete=0 ;
                                            last   ;
    				} 
    	        }
    		 close FI;
                    if(todelete) {
                         push (@tobedeleted, $lf);
                    }
     
    }
    Excuse-moi, mais je n'arrive pas a bien indenter ce code. La deuxième version devrait être plus économique en mémoire.
    Cordialement
    Nibroc

    Citation Envoyé par yzf-r Voir le message
    Salut,

    J'ai une liste de plusieurs fichiers logs et je voudrais ne garder que ceux qui contiennent $info.
    J'ai fait le bout de code suivant, mais ca ne fonctionne pas.
    Existe-t-il une instruction du type "dés que", genre "dés que j'ai trouvé $info dans $lf, je m'arrête de le parser, je le stocke sous @result_files et je passe au log $lf suivant. Si je ne trouve pas $info dans $lf alors je le stocke sous @tobedeleted".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    foreach $lf (@l_files){
    		open(FI,"<$lf") or die ("Impossible to open the file $_.\n");
    		while ( my @l = <FI> ) {
    			foreach $l (@l){
    				if ($l =~ /$info/i) {
    					push (@result_files, $lf);
    				} else {
    					push (@tobedeleted, $lf);
    				}
    			}
    		}
    		close FI;
    	}
    par avance merci

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Tu peux utiliser une étiquette
    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
    # étiquette donnée à la boucle FILE
     
    FILE: 
    foreach $lf (@l_files){
    		open(FI,"<$lf") or die ("Impossible to open the file $_.\n");
    		while ( my @l = <FI> ) {
    			foreach $l (@l){
    				if ($l =~ m/$info/i) {
    					push (@result_files, $lf);
    					close FI;
    					next FILE;
    				} else {
    					push (@tobedeleted, $lf);
    				}
    			}
    		}
    		close FI;
    	}

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Par défaut
    impeccable!

    merci à tous les deux. Ça fonctionne du tonnerre maintenant.

  5. #5
    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 : 59
    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
    Par défaut
    Je me permet une troisième version, qui évite les faux goto que sont les instructions last :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @tobodeleted(@l_files); # Par défaut, ils ne contiennent pas l'info
    foreach $lf (@l_files) {
      open my $FI, "<", $lf or die ("Impossible to open the file $lf.\n");
      my found;
      do {
        $found = <$F> =~ /$info/i;
      } until eof $F || $found;
      # Si le fichier contient l'info, on le retire de @tobedeleted pour l'ajouter à @result_files
      push @result_files, shift @tobedeleted if $found;
      # close inutile si le filehandle est stocké dans une variable my
    }
    Attention, dans cet exemple, @tobedeleted contiendra des noms de fichiers, ce qui n'est pas le cas, sauf erreur, de ton premier script et du dernier de jasmine qui contiennent le nom du fichier autant de fois que le nombre de ligne qu'il contient.

    @jasmine : quel est l'intérêt de la double boucle "while (my @l = <FI> ) { foreach $l (@l) { ..." ?

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    @jasmine : quel est l'intérêt de la double boucle "while (my @l = <FI> ) { foreach $l (@l) { ..." ?
    Tu as raison, il n'y a aucune utilité, j'ai bêtement repris le code de départ.
    J'airais simplement dû faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( my $l = <FI> ) {

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/08/2004, 14h48

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