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 boucle for


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut problème boucle for
    Bonjour,

    J'ai recontré un problème lorsque je programmais un logiciel qui permettait de calculer une fonction mathématique passée en argument avec une intervalle donnée.

    Le problème est au niveau d'une boucle for.
    Voici la boucle en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(my $i = 0; $i < $max_intervalle; $i++)) {
                    $result = faire_operations($i, @expression_mathematique);
                    print 'f(' . $i . ')=' . $resultat . "\n";
          }
    Je voudrais incrémenter $i avec une variable $saut. Je voudrais donc pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(my $i = 0; $i < $max_intervalle; $i + $saut)) {
    Cette syntaxe donne lieu a des comportements énigmatiques. Est-ce impossible de réaliser cela en Perl ? Ou alors y a t-il une syntaxe spéciale ?

    Je pourrais utiliser une boucle while mais elle ne correspond pas au traitement effectué.

    Merci de votre lecture.

  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
    La syntaxe correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(my $i = 0; $i < $max_intervalle; $i += $saut)) {
    Une manière plus "perlish" (mais je le concède, moins lisible quand il s'agit d'une boucle à pas différent de 1 ; pour des pas de 1, utiliser l'opérateur d'intervalle seul) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $i (map $_ * 5, 0 .. ($max_intervalle-1)/$saut) {
    Avec la boucle initiale, cela aurait donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $i (0 .. $max_intervalle-1) {
    qui présente l'avantage de ne générer aucun calcul sur i (source d'erreur), et qui affiche clairement au lecteur la valeur des bornes de $i.
    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 à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Les deux autres propositions me paraissent obscures... Je vais devoir quitter mes vieilles habitudes C.

    Merci pour tout.

  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
    Pour traiter des listes d'éléments en perl, il généralement possible de se passer du traitement de l'index, en utilisant directement un itérateur sur les valeurs du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @prenoms = ("toto", "tutu", "titi");
    foreach my $prenom (@prenoms) {
      # traitement de $prenom
    }
    S'il est absolument nécessaire d'utiliser l'indice, par exemple, pour traiter deux tableaux en parallèle, il est alors possible d'utiliser un itérateur sur une liste d'indice, liste construite à partir de l'opérateur d'intervalle .. (point point).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @prenoms = qw(toto tutu titi);
    my @noms = qw(momo mumu mimi);
    foreach my $index (0 .. $#prenoms) { # ou bien 0 .. @prenoms-1
      # traitement de $prenoms[$index] et $noms[$index]
    }
    On peut aussi, dans ce cas, tirer avantageusement parti du module List::MoreUtils, et de sa fonction pairwise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @noms_prenoms = pairwise {
      # traitement de $a et $b contenant chaque élément de @prenoms et @noms
      "$b $a";
    } @prenoms, @noms;
    ou bien l'itérateur each_array:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $ea = each_array(@prenoms, @noms);
    while ( my ($prenom, $nom) = $ea->() ) {
      # traitement de $prenom et $nom
    }
    Pour finir, ton cas concernait le traitement d'un indice sur $saut.
    Dans ma proposition, j'ai utiliser un itérateur d'index basé sur des indices multiples de $saut de la manière suivante :
    - construction d'une liste d'indice allant de 0 à la moitié de l'index max :
    0 .. ($indice_max-1)/$saut)
    - et pour chaque indice, celui-ci est multiplié par $saut pour obtenir une liste : 0, $saut, 2*$saut, ... ; ceci en utilisant l'opérateur map :
    map $_ * $saut

    Mais on peut aussi utiliser la fonction indexes du module List::MoreUtils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $i (indexes { $_ % $saut == 0 } 0 .. $max_intervalle-1) {
    En espérant avoir été plus clair
    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. Problème boucle for
    Par revsys dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2007, 15h50
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

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