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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Points : 18
    Points
    18
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    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)
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    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
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    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;
    }
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    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é...
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    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.
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  7. #7
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Afin de ne pas mêler inutilement les autres programmeurs, utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for my $element (@array) {
    }
    Il y a plus d'une façon de faire les choses en Perl, mais il est préférable de choisir celle la plus utilisée autant que possible.

  8. #8
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par pospos
    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.
    En fait, autant d'élément à la fois que tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pugs> for (1..9) -> $a, $b, $c { say "$b $a $c" }
    2 1 3
    5 4 6
    8 7 9
    undef
    pugs>

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