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 :

D'une référence vers un tableau


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut D'une référence vers un tableau
    Salut !

    Tout à l'heure, je me suis amusé à coder un petit jeu de pendu en Perl et j'ai été confronté à un problème que je n'arrive pas à expliquer. Soit une routine has qui prend un tableau de lettres et un motif, et qui renvoie Vrai si ce motif est trouvé dans le tableau.
    Voici la manière dont je l'ai codé (cela fonctionne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub has {
      my ($a, $p) = @_;
      for(@$a) {
        return 1 if $_ eq $p;
      }
      return 0;
    }
    Rien de bien particulier ici. Seulement, mon premier jet était le suivant, et à ma grande surprise il fonctionnait très mal (comme s'il n'y avait qu'un seul élément dans @_) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub has {
      my (@a, $p) = (@{shift;}, shift);
      for(@a) {
        return 1 if $_ eq $p;
      }
      return 0;
    }
    Est-ce l'expression @{shift;} qui n'est pas correcte ? Merci de m'éclairer.

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Il faut garder les références jusqu'au bout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($a, $p) = (shift, shift);
    et donc utiliser @$a et $p tout le long de ta fonction.

    L'autre solution possible (a tester) pourrait etre de recuperer $p avec shift, donc de retirer du tableau d'argement cette valeur, puis de recuperer les autres valeurs en tant que un seul tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($p, @a) = (shift, shift);
    Ou quelque chose de ce genre. L'idée est que tous les arguments sont considerés comme un seul tableau. Donc quand tu veux mettre une variable dans un tableau de facon explicite (@a), Perl a tendance a y fourrer tous les arguments. Si tu retire ton 1er argument, plus de soucis : Perl peut bien tout mettre, c'est ce que tu veux !

    Z.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Qu'entends-tu par «il faut garder les références jusqu'au bout» ?
    Quand j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my (@a, $i) = (@{shift;}, shift);
    Je m'imagine la chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my ($a, $i) = @_; #dans notre cas, @_ <=> (shift, shift)
    my @a = @$a;
    En somme, je pensais qu'on pouvait raccourcir cela en effectuant la conversion référence->tableau en même temps qu'on récupère l'argument, via la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @t = @{$address}; #ou $address est dans notre cas la première valeur du tableau
    EDIT
    Ah, non, je viens de comprendre; c'est un des petits pièges de Perl ! Dans mon expression d'affectation, ma liste @a est gloutonne (ce n'est pas le cas en Ruby, par exemple). Elle récupère donc tout ce qui est à droite de l'opérateur d'affectation, laissant $i indéfinie ! Bien sûr, tout fonctionne si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sub has {
      my @t = @{shift;};
      my $p = shift;
      ...
    }
    J'aurais dû plus réfléchir avant de poster .

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/04/2009, 14h29
  2. Réponses: 4
    Dernier message: 03/10/2008, 14h29
  3. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30
  4. Comment stocker une référence vers un TTreeNode ds un DFM ?
    Par phplive dans le forum Composants VCL
    Réponses: 1
    Dernier message: 19/07/2005, 12h33
  5. Réponses: 2
    Dernier message: 30/05/2002, 10h19

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