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 :

while vs foreach var list (@toto)


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
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut while vs foreach var list (@toto)
    Bonjour,

    j'ai une variable "liste" appelée @toto. Je la remplie par des push tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $test = "toto";
    push(@toto, $test);
    J'ai l'habitude depuis "toujours" de lire mes var liste avec while tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (<@toto>) {
      print $_;
    }
    Je suis tombé sur un cas qui remettrait en cause l'utilisation de while pour lire ce type de variable. En effet et voulant "pusher" une chaine contenant une "*", j'ai un soucis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $test = "toto*";
    push(@toto, $test);
    mon while ne lit plus rien du tout, alors qu'un foreach fonctionne comme attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach $_ (@toto) {
      print $_;
    }

    Quelqun pourrait m'expliquer le pourquoi du comment ?

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    ta syntaxe while ne peut pas marcher: le while <> sert à lire des fichiers, non à iterer un array.

    pour un array tu a le choix entre ces syntaxes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for my $element (@array) {
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach my $element (@array) {
    }
    (exactement equivalent)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (my $element = shift @array) {
    }
    sachant que dans ce dernier cas tu vide effectivement ton array

    la syntaxe la plus souhaitable est la premiere
    (tu a aussi le for( ;; ) c style, mais ca n'a pas bcp d'interet pour parcourir un array existant)

  3. #3
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Citation Envoyé par pospos
    la syntaxe la plus souhaitable est la premiere
    (tu a aussi le for( ;; ) c style, mais ca n'a pas bcp d'interet pour parcourir un array existant)
    L'intérêt peut être de modifier la variable de l'élement plus facilement en fonction du nombre de boucles effectuées, ou de modifier les élements précédents ou suivants du tableau ($tab[$i+1], $tab[$i-1]).

    Petite précision, modifier $_ dans un foreach modifie la valeur de l'élement correspondant dans le tableau, ce qui n'est pas le cas si l'on modifie $element

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    Citation Envoyé par Woufeil
    Petite précision, modifier $_ dans un foreach modifie la valeur de l'élement correspondant dans le tableau, ce qui n'est pas le cas si l'on modifie $element
    si, c'est aussi le cas avec une variable en my, car c'est alors un alias (ce qui le rend en pratique aussi efficace que d'utiliser $_, et meme un peu plus car "my" est utilisé au lieu d'un "local" implcite avec $_).
    Si tu veux faire une modif sans modifier le tableau tu dois faire une copie explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for my $elem (@array) {
        my $copy = $elem;
        $copy = 1;
    }

  5. #5
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Citation Envoyé par pospos
    si, c'est aussi le cas avec une variable en my, car c'est alors un alias (ce qui le rend en pratique aussi efficace que d'utiliser $_, et meme un peu plus car "my" est utilisé au lieu d'un "local" implcite avec $_).
    Si tu veux faire une modif sans modifier le tableau tu dois faire une copie explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for my $elem (@array) {
        my $copy = $elem;
        $copy = 1;
    }

    Je sais pas d'où me venais cette idée, désolé...

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    c'est assez trompeur comme syntaxe
    heureusement perl6 va clarifier tout ca (is copy, etc...)
    on pourra meme iterer une liste deux elements à la fois, etc.

Discussions similaires

  1. [Débutant] XML foreach (var .. in .. where ) break?
    Par vladvonjim dans le forum C#
    Réponses: 6
    Dernier message: 13/12/2011, 14h18
  2. Convertir une List<Object> en List<Toto>
    Par onlytoine dans le forum Langage
    Réponses: 7
    Dernier message: 19/01/2009, 14h37
  3. [MySQL] Erreur boucle while et foreach
    Par tiesto95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/01/2009, 12h01
  4. Foreach avec liste de fichiers
    Par Earl7 dans le forum Langage
    Réponses: 8
    Dernier message: 16/06/2008, 10h28
  5. [VB.NET] Faire un "IF var IN ("toto","ti
    Par napo7 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/04/2006, 22h06

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