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 :

Eclaircissement sur bloc de code


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut Eclaircissement sur bloc de code
    Bonjour,

    je profite des congés pour potasser certains sujets comme http://laurent-rosenfeld.developpez....ateurs-listes/

    Aux chapitres 2.1 et 2.2, je ne comprends pas la syntaxe utilisée, sa séquence, ses règles, dans le bloc de code utilisé dans la fonction grep :

    Chapitre 2.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print join '-', grep { $dupl = ($_ == $prev ? 0: 1); $prev = $_; $dupl}
    Chapitre 2.2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print join '-', grep { $a = $b == $_? 0: 1; $b = $_; $a;}
    Merci de vos lumières sur les parties en gras.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Prenons le bloc du chapitre 2.1:

    $dupl est un booléan (valeur vraie ou fausse). Si le valeur courante est égale à la valeur précédente, $dupl est mis à 0 (faux), sinon il est mis à 1 (vrai). Ensuite, on met va laveur de $prec à la valeur courante (pour l'itération suivante). Puis on renvoie 0 (faux) si c'est un doublon de la valeur précédente (et, donc, grep, ne laissera pas passer $_) et 1 si ce n'est pas un doublon (et, donc, le grep laissera passer $_).

    L'autre (2.2) est construit de la même façon, mais en utilisant $a et $b au lieu de $_. Si je me souviens bien, les variables spéciales $a et $b sont expliquées à cet endroit.

    J'espère que c'est plus clair ainsi. Sinon, n'hésite pas à demander.

    Je m'aperçois qu'il faudra peut-être que j'ajoute des explications complémentaires dans mon tuto.

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Je pense avoir compris.

    Partons de la liste triée renvoyée par map { s/^0//g; $_ }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2 3 4 4 6 6 8 8 9 10 12 12 15 16 20
    pour arriver à l'exécution de grep { $dupl = ($_ == $prev ? 0: 1); $prev = $_; $dupl}

    $dupl = ($_ == $prev ? 0: 1)
    $dupl est mis à 0 ou 1 en fonction du résultat de la comparaison de la valeur courante $_ avec $prev

    $prev = $_
    la valeur courante est sauvegardée dans $prev pour la prochaine itération

    $dupl
    et enfin on évalue $dupl avec la dernière instruction du bloc, si vrai la valeur est retournée par le grep, sinon, on passe à la prochaine itération
    C'était cette dernière instruction du bloc que j'arrivais pas à interpréter et qui en fait sert à évaluer le bloc à vrai ou faux pour renvoyer ou non la valeur courante.

    C'est OK ?
    ps : je pense que ce serait utile de détailler un peu cette partie dans cet excellent tuto qui nous fait découvrir un style de programmation différent et très intéressant, ouvrant de nouvelles possibilités.

    Un grand MERCI

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Oui, c'est OK, c'est exactement ça.



    Je regarderai pour ajouter quelques explications, mais peut-être pas tout de suite.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Laurent,

    je reviens un peu sur le tuto car il y a un truc qui doit m'échapper : au chapitre 2.3, il est écrit que les multiples de 2, 3 et 4 inférieurs ou égaux à 20 peuvent être obtenus par les nombres divisibles par 2 ou 3 inférieurs ou égaux à 20. Or 14 et 18 sont bien des multiples de 2 et de 3, mais pas de 4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl -w
    use strict;
    use feature 'say';
     
    my ($dupl, $prev) = ( 0, 0 );
     
    say join '-', grep { $dupl = ( $_ == $prev ? 0:1 ); $prev = $_ ; $dupl }
                    sort { $a <=> $b }
                    map  { $_ * 2, $_ * 3, $_ * 4 } 1..5;
     
    say join '-', grep { $_ % 2 == 0 || $_ % 3 == 0 } 1..20;
    sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2-3-4-6-8-9-10-12-15-16-20
    2-3-4-6-8-9-10-12-14-15-16-18-20

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bon, peut-être que la formulation n'est pas parfaitement claire, mais le contexte l'est: il s'agit de trouver les multiples de 2, les multiples de 3 et les multiples de 4 inférieurs ou égaux à 20. Et non les nombres qui sont à la fois multiples de ces trois chiffres.

    La liste produite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2-3-4-6-8-9-10-12-14-15-16-18-20
    le montre clairement: 2, 4, 8, 10 ... ne sont pas multiples de 3. Et 3, 9 et 15 ne sont pas multiples de 2. Et le grep fait bien un OR entre la propriété multiple de 2 et la propriété multiple de 3.

    S'il s'agissait de retenir les nombres qui sont à la fois multiples de 2, 3 et 4, il s'agirait en fait de trouver les multiples de 12... et seul 12 se qualifierait pour ce qui est des entiers inférieurs à 20.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Ok, merci pour les précisions

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

Discussions similaires

  1. Eclaircissements sur un bout de code
    Par namstou3 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/09/2007, 20h47
  2. Réponses: 6
    Dernier message: 22/09/2005, 16h59
  3. [VB.NET] Eclaircissement sur la fonction IsDBNull
    Par shinchan dans le forum Windows Forms
    Réponses: 9
    Dernier message: 04/01/2005, 09h59
  4. [VB6] mise en commentaire d'un bloc de code
    Par JuanDeLaPlaya dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 15h05

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