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 :

Mauvaise utilisation de la fonction map en perl 6 ? [perl6]


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut Mauvaise utilisation de la fonction map en perl 6 ?
    Bonjour,

    Commençant en perl6, paf, je tombe sur un comportement étrange.
    Ce code-ci ne fonctionne pas (enfin comme je voudrais)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    !/home/alain/rakudo-star-2016.01/install/bin/perl6
     
    sub createObj(Str $line) {
        say  split " ",$line;
        map {say $_}, split " ",$line;
    #    return;
    }
     
    map {createObj($_)}, ("a b","c d");
    Il n'exécute que la ligne 4.
    Si j'inverse la ligne 4 et 5, ou si je rajoute le "return", il fonctionne comme je le désire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (a b)
    a
    b
    (c d)
    c
    d
    Une idée ?

  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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je pense que ton utilisation de map n'est pas bonne. La principale fonction de map est de renvoyer une liste de valeurs (en fait un type Seq) que l'on peut affecter à un tableau ou utiliser dans un autre opérateur de liste. Ici, tu utilises map sans contexte de retour, ce qui n'est pas bon. Comme la fonction map est paresseuse, je pense qu'elle considère dans ton code qu'elle n'a pas besoin de s'exécuter et donc ne fait rien.

    Il vaut mieux utiliser une boucle for.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sub createObj(Str $line) {
         say $_ for split " ", $line;
    }
     
    map {createObj($_)}, ("a b","c d");
    Ce qui imprime:
    Ou alors simplement imposer un contexte de liste obligeant map à remplir un tableau en sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sub createObj(Str $line) {
         my @array = map {say "$_"}, split " ", $line;
    }
     
    map {createObj($_)}, ("a b","c d");
    ce qui imprime la même chose que précédemment. Comme map doit remplir le tableau @array, du coup elle s'exécute vraiment et son effet de bord (l'impression des valeurs) se manifeste. Mais, même si ça permet d'obtenir le résultat que tu recherches, ce n'est pas la bonne manière de faire, une boucle for est bien meilleure.

    Le map de la dernière ligne (celle appelant la fonction createObj) est également mal utilisé à mon avis (même si ça ne gêne pas ici), il vaudrait mieux utiliser un for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    createObj $_ for "a b", "c d";
    Ou avec un bloc pointu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for "a b", "c d" -> $string {
        createObj $string;
    }

  3. #3
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Bonjour,

    Bien le merci.

    J'ai sans doute pris de mauvais habitude, car en perl5, ça fonctionne.

    Mais en effet, autant utiliser le "for".
    Bon, j'ai bien l'intention de faire quelque chose de mon map, mais comme je commence, je voulais savoir si mon split fonctionnait avant d'aller plus loin, vu qu'il faut faire attention à la nouvelle ponctuation, sigil,...

    Bien le merci.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonjour,

    J'ai renommé le titre de ta discussion pour qu'elle colle mieux au problème.
    Il faudrait dire aux développeurs Perl5 dès que l'occasion se présente de bien utiliser la fonction map afin de prendre de bonnes habitudes.

    Merci pour vos réponses !

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

Discussions similaires

  1. Utilisation de la fonction map() ?
    Par Norore dans le forum Langage
    Réponses: 7
    Dernier message: 04/02/2011, 11h16
  2. [langage] traduction d'un fonction python en perl
    Par ay_pepito dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2007, 15h06
  3. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  4. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50
  5. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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