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 :

Question sur les prototypes de fonctions


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    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
    Par défaut Question sur les prototypes de fonctions
    Bonjour à tous,

    j'ai une petite question sur les prototypes de fonctions, plus particulièrement quand on passe un bloc de code avec l'éperluette (&). Voici un exemple de code qui ne retourne pas le bon résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    sub my_map(&@) {
      my $block = shift;
      my @new;
     
      foreach my $e (@_) {
        push @new, $block->($e);
      }
      return @new;
    }
     
     
    my @a = my_map { $_ + 3 } (1, 2, 3, 4);
    print "@a\n";
    Au lieu d'écrire 4 5 6 7 comme on s'y attendrait, on obtient le résultat 3 3 3 3. Afin d'obtenir la bonne réponse, on doit éliminer la variable $e du code et utiliser $_ à la place, comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    sub my_map(&@) {
      my $block = shift;
      my @new;
     
      foreach (@_) {
        push @new, $block->($_);
      }
      return @new;
    }
     
     
    my @a = my_map { $_ + 3 } (1, 2, 3, 4);
    print "@a\n";
    Quelqu'un peut-il m'expliquer pourquoi?

  2. #2
    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
    Salut !

    Le problème ne vient pas du prototype ni même de ta fonction mais de ton appel !
    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @a = my_map (sub{ $_ [0]+ 3; }, (1, 2, 3, 4));
    Ca marchera beaucoup mieux

    En fait, ton second code marche parce que la valeur de $_ est correcte avant l'appel de ton bloc, mais c'est plus in coup de chance qu'autre chose.

    Ah, l'erreur bête qu'on voit jamais $_ à la place de $_[0]

  3. #3
    Membre émérite
    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
    Par défaut
    Ah! Je mêle pas $_ et $_[0], par contre je me fiais au comportement de map et grep, et je pensais que le $_ était "magique" dans les blocs. Quand tu as utilisé une fonction anonyme, j'ai tout de suite pigé l'attrape. Merci

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

Discussions similaires

  1. Petite question sur les return de fonction
    Par gueulederack dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/11/2011, 17h56
  2. Diverses questions sur les fonctions de conversion
    Par Louis-Guillaume Morand dans le forum Access
    Réponses: 12
    Dernier message: 27/12/2006, 10h56
  3. Question sur les fonctions ORACLE
    Par Fakhry dans le forum SQL
    Réponses: 8
    Dernier message: 12/12/2006, 17h13
  4. [Dates] Question sur les fonctions Date
    Par cerede2000 dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2006, 17h26
  5. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47

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