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 :

Incrémenter automatiquement des noms de variables ?


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Incrémenter automatiquement des noms de variables ?
    Bonjour,

    Je voulais savoir s'il existe un moyen de créer automatique des noms de variables. J'ai bien essayé quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my $long = length($vect);
    for (my $i=0; $i <= $long-1; $i++) {
        my @var.'$i' = split('', $vect[$i]);   ### c'est ici que je veux créer une variable différente à chaque fois au lieu d'en créer 200 manuellement
        print "@var.'$i'\n";
    }
    Global symbol "$seqs2" requires explicit package name at parsing.pl line 111.
    Execution of parsing.pl aborted due to compilation errors.
    J'ignore si Perl aime et/ou comprend ce genre de notation (je le faisais en bash).

    En fait dans mes "vecteurs" se trouvent des séquences. Et j'aimerais toutes les comparer position par position, c'est pour ça que je ne peux pas garder les listes de chaînes de caractère et que je veux spliter chaque séquence dans une nouvelle liste.

    Merci de m'avoir lue.

    Cynthia.

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

    c'est techniquement possible, cela s'appelle des références symboliques, mais ce n'est pas du tout recommandé, vraiment pas du tout (cela existait en Perl 4 et, du coup, ça n'a pas été supprimé du langage pour préserver la rétrocompatibilité, mais ce n'est plus à faire en Perl 5, dont la première version est sortie en 1994, il y a plus de 20 ans). C'est tellement peu recommandé que c'est interdit si on utilise le pragma "use strict;", ce que tu devrais faire pour tout programme de plus d'une seule ligne si tu ne le fais pas déjà. Donc, je m'abstiendrai de te dire comment faire (je sais comment faire, mais je ne le fais pas, fais comme moi, ne prends pas de mauvaises habitudes) et te donnerai plutôt la bonne méthode pour gérer ce genre de cas, ou l'une des bonnes méthodes (car l'une des devise de Perl est qu'"il y a plus d'une manière de le faire").

    Commençons avec un cas un peu plus simple. Suppose que tu veuilles stocker les dix mots d'une phrase dans des variables. Tu pourrais vouloir stocker ces mots dans des variables nommées $var1, $var2, ... $var10, comme on le fait occasionnellement en shell (et comme on peut le faire avec les références symboliques). En lisant ton code, je vois que tu n'utilises pas une méthode aussi malcommode. Naturellement, tu utilises un tableau et écris quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @mots = split /\s/, $phrase;
    Si ma phrase a 11 mots, ou 12, le code ci-dessus continuera à fonctionner. Alors qu'avec $var1, $var2, ... $var10, tu perdrais les dernières valeurs

    Dans ton cas réel, c'est un tout petit peu plus compliqué, parce que chacune des variables que tu voudrais créer est non pas un scalaire, mais un tableau. Dans ce cas, la solution la plus simple est de créer un tableau de tableaux (ou AoA, array of arrays). Un tableau ne peut normalement contenir que des valeurs scalaires. Comment un tableau pourrait-il contenir des tableaux? En fait, un tableau de tableaux est un tableau de références vers des tableaux. Une référence est une variable scalaire qui contient l'adresse mémoire d'une autre variable, cette autre variable pouvant être un autre tableau (un peu l'équivalent d'un pointeur en C).

    Avant de donner un exemple de code, je dois préciser que ton code est profondément erroné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $long = length($vect);
    Cela suppose que $vect est une variable scalaire et qu'elle contient probablement une chaîne de caractères dont tu veux déterminer la longueur. Je ne pense pas que ce soit ce que tu veux faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... = split('', $vect[$i]);
    Cela suppose maintenant que @vect est un tableau contenant sans doute des chaînes de caractères que tu veux splitter en lettres individuelles. Bien que Perl puisse gérer de façon distincte une variable $vect et une variable @vect, il n'est pas recommandé de faire ce genre de chose: si Perl ne s'embrouille pas, toi et moi, nous nous embrouillerons très probablement. De toutes façons, au vu de ton code, il s'agit bien de la même variable. Les pragmas "use strict;" et "use warnings" auraient détecté l'erreur.

    Bon, je vais supposer que le tableau @vect contient une liste de chaînes de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    use strict;
    use warnings;
    use Data::Dumper ; # pour afficher plus loi la structure de donnée créée
     
    my @vect = qw /toto titi tutu/;
    my @tableau_de_tableaux;
     
    for my $mot (@vect) {        # affecte à $mot chaque élément successif de @vect, plus simple que la boucle for à la C
         my @temp = split //, $mot;
         push @tableau_de_tableaux, \@temp;   # \@temp est une référence au tableau @temp
    }
    print Dumper \@tableau_de_tableaux;
    NB: le tableau temporaire @temp n'est pas vraiment nécessaire et les 4 lignes de code de la boucle for pourraient même tenir en une seule ligne, mais je préfère rester pédagogiquement simple et progressif.

    La dernière instruction du code ci-dessus affiche la structure résultante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    $VAR1 = [
              [
                't',
                'o',
                't',
                'o'
              ],
              [
                't',
                'i',
                't',
                'i'
              ],
              [
                't',
                'u',
                't',
                'u'
              ]
            ];
    Le tableau @tableau_de_tableaux contient trois éléments: un tableau contenant les lettres de "toto", un contenant les lettes de "titi, etc.

    En utilisant une autre façon d'afficher le contenu, on obtient ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    0  ARRAY(0x6003f5cb8)
       0  ARRAY(0x60025ccd8)
          0  't'
          1  'o'
          2  't'
          3  'o'
       1  ARRAY(0x60050cdd8)
          0  't'
          1  'i'
          2  't'
          3  'i'
       2  ARRAY(0x6005031e8)
          0  't'
          1  'u'
          2  't'
          3  'u'
    Cette deuxième façon d'afficher a l'avantage de bien montrer les références. Le tableau externe contient les trois références (ou adresses mémoire) suivantes : 0x60025ccd8, 0x60050cdd8 et 0x6005031e8. Et l'adresse mémoire 0x60025ccd8 pointe vers le tableau suivant: ('t', 'o', 't', 'o').

    Pour accéder à la troisième lettre (indice 2) du second tableau (indice 1), donc le second "t" de titi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $lettre = $tableau_de_tableaux[1][2]
    Bon, résoudre ton problème m'a obligé à introduire des notions légèrement avancées (structures de données imbriquées et références), j'espère l'avoir fait clairement, mais il se peut que tu te sentes un peu dépassée. N'aie pas peur, ce n'est pas aussi compliqué que ça peut en avoir l'air la première fois que l'on voit ce genre de trucs. Et ça vaut la peine de faire l'effort de maîtriser, si tu ne connaissais pas, tu ne peux imaginer à quel point c'est puissant.

    Si tu veux des informations complémentaires, va voir le chapitre consacré aux références du très bon tuto Perl de Sylvain Lhullier.

    Et si tu rencontres des difficultés, n'hésite pas à poser des questions sur ce forum, nous sommes prêts à t'aider. Et même, comme tu peux le constater à la simple longueur de ce post (env. 50 minutes pour le rédiger), je fais des efforts non négligeables pour aider ceux qui en ont besoin (je suis loin d'être le seul ici).

    Bonne fin de soirée,
    Laurent.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour Laurent,

    Merci d'avoir pris le temps de me répondre et de m'expliquer. Je pense que je vais écrire mes listes dans un fichier et travailler dessus, ça sera plus simple alors (plus conseillé, je présume.)


    Cynthia

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

Discussions similaires

  1. Paramétrage des noms de variables
    Par AndréPe dans le forum Access
    Réponses: 2
    Dernier message: 07/10/2006, 15h54
  2. [Tableaux] Chaine contenant des noms de variables
    Par novices dans le forum Langage
    Réponses: 6
    Dernier message: 06/04/2006, 23h33
  3. [Stratégie] Générer des noms de variables
    Par Rekiem dans le forum Général Java
    Réponses: 31
    Dernier message: 09/01/2006, 10h23
  4. [Convention]Préfixage des noms de variables
    Par javaSudOuest dans le forum Langage
    Réponses: 5
    Dernier message: 18/11/2005, 15h52
  5. Generer des noms de variables avec une boucle
    Par moutanakid dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/07/2004, 17h45

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