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 :

[PERL] Nom de Variable Dynamique


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut [PERL] Nom de Variable Dynamique
    Bonjour,

    Je suis une débutante en langage PERL.
    Je souhaiterai savoir comment avec un incrément $i créer des noms de variables dynamiquement.
    Je me perds dans la syntaxe.

    Ce serait pour utiliser des noms de tableaux de hashage % différents en référence \ dans un tableau @.
    Je ne sais pas si je suis claire.
    Merci d'avance.

  2. #2
    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
    Je suis un peu perdu par ton explication, plus de contexte pourrait aider (ce que tu veux mettre dans ton hash par exemple). C'est certain qu'il existe une façon plus propre de régler ton problème. Par contre, dans le but d'informer, voici comment faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
        no strict 'vars';
        $i = 10;
        ${"foo$i"} = "dynamique!";
        print $foo10, "\n";
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut
    Merci bcp, ça marche

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut
    Citation Envoyé par GnuVince
    Je suis un peu perdu par ton explication, plus de contexte pourrait aider (ce que tu veux mettre dans ton hash par exemple). C'est certain qu'il existe une façon plus propre de régler ton problème. Par contre, dans le but d'informer, voici comment faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
        no strict 'vars';
        $i = 10;
        ${"foo$i"} = "dynamique!";
        print $foo10, "\n";
    }
    Pourrais-tu m'éclairer sur l'utilisation de
    no strict 'vars';
    ?

    Est-ce que c'est obligatoire de l'utiliser pour ce problème de variables dynamiques ? Pour un souci de lisibilité et de fiabilité, j'emploie
    use strict;
    pour la partie déclarative avec my.

    Merci.

  5. #5
    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
    Si tu utilises use strict, le no strict 'vars' est obligatoire en effet. Et tu es mieux de le mettre dans un bare block, de façon à ce que à la sortie du bloc ça reviennent complètement strict.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut [PERL] Syntaxe
    Citation Envoyé par GnuVince
    Si tu utilises use strict, le no strict 'vars' est obligatoire en effet. Et tu es mieux de le mettre dans un bare block, de façon à ce que à la sortie du bloc ça reviennent complètement strict.
    C quoi un bare block stp ?

  7. #7
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Citation Envoyé par mcshu
    C quoi un bare block stp ?
    C'est un bloc qui commence par une accolade ouvrante et qui se termine par une accolade fermante

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    si tu veux creer des variables dynamiquement ce que tu veux c'est une hash table (ou un tableau).
    Serieusement, il n'y a presque aucune raison d'utiliser des vairables dynamqiues comme cela.

  9. #9
    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
    Citation Envoyé par pospos
    si tu veux creer des variables dynamiquement ce que tu veux c'est une hash table (ou un tableau).
    Serieusement, il n'y a presque aucune raison d'utiliser des vairables dynamqiues comme cela.
    Comme mentionné dans le post original, c'est pour créer ses clés de hash. C'est pourquoi je voulais plus d'informations, car je suis convaincu qu'il existe une façon beaucoup plus simple que de créer des variables dynamiquement.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut [PERL] Nom dynamique d'un tableau de hashage
    Je suis désolée si je n'ai pas été claire dans ma question et aussi de ne pas avoir fourni de code aux 'forumeurs'.

    Je lis les données d'un fichier MVS que je souhaite récupérer dans un tableau de référence de hashage.
    Voila.
    'Code suite aux réponses'
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #!/usr/bin/perl -w
     
    use strict;
     
    use DBI qw(:sql_types);
    use Date::Calc qw(:all);
     
    #Déclarations
    my $fichier_donnees;
    my $erreur;
    my $FICHIER_MVS;
     
    open($FICHIER_MVS, $fichier_donnees) or $erreur = "Echec à l'ouverture du fichier de données";
    if ($erreur ne '') {$req = '';fin();}
     
    comptage_MVS();
     
    close($FICHIER_MVS) or $erreur = "Echec de fermeture du fichier $FICHIER_MVS \n";
    if ($erreur ne '')
    {
    	exit 1;
    }
     
    exit 10;
     
     
    sub comptage_MVS
    {
      no strict 'vars';
     
      my $lignes;
      my $organisme;
      my $site;
      my $annee;
      my %tabhash;
      my @tab_lignesMVS;
      my $i; # permet l'utilisation d'un tableau de données pour affecter ligne à ligne
      my $compteur_lignesMVS; #nb total de lignes
      my $cle;
      my $valeur; #Usage par le hashage
     
      $i = 0;
      while ($lignes = <$FICHIER_MVS>)
      {
       	chomp ($lignes);
       	$i++;
        ############ Affectation des valeurs par clé de hashage du tableau de hashage
        ${"tabhash$i"}{SITE} = substr($lignes, 0,4);
        ${"tabhash$i"}{ANNEE} = substr($lignes, 4, 4);
        ${"tabhash$i"}{ORGANISME} = substr($lignes, 8, 3);
     
        ############ Affectation ligne à ligne
        $tab_lignesMVS[$i] = \%{"tabhash$i"};
      }#while
     
      $compteur_lignesMVS = $i;
     
      # Parcours du tableau de hashage 
      $i = 0;
      do
      {
    	foreach $cle (keys %{$tab_lignesMVS[$i]})
        {         
             if ($cle eq 'SITE')
             {
               $site = $valeur;
             }
             if ($cle eq 'ANNEE')
             {
               $annee = $valeur;
             }
             if ($cle eq 'ORGANISME')
             {
               $organisme = $valeur;
             }         
          }      
     
        } 
        $i++;	 
      } 
      until ((($site eq 'S173') && ($annee eq '2006') && ($organisme eq '004')) || ($i = $compteur_lignesMVS));  
    }
    Mon problème est que :
    dans les lignes suivantes, si je laisse comme ça sans variable dynamique, si je cherche à me balader dans mon tableau @tab_lignesMVS, je ne récupère pour tous les indices que les données de la dernière affectation càd les données du dernier tableau de hashage affecté à @tab_lignes MVS

    'Code avant réponse'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $tabhash{SITE} = substr($lignes, 0, 4);
        $tabhash{ANNEE} = substr($lignes, 4, 4);
        $tabhash{ORGANISME} = substr($lignes, 8, 3);
     
        $tab_lignesMVS[$i] = \%tabhash;
    Sur la partie 'Code suite aux réponses', ce qui ne marche c'est l'emploi dans le même programme de et de ou bien je m'y prend mal ...

    Si vous avez des suggestions sur la manière d'appréhender mon problème, je suis preneuse !!!

    Je vous remercie d'avance pour votre aide.
    Merci déjà à GnuVince.

  11. #11
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Pourquoi ne pas faire une hash à 2 niveaux ???

    remplacer

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        ${"tabhash$i"}{SITE} = substr($lignes, 0,4);
        ${"tabhash$i"}{ANNEE} = substr($lignes, 4, 4);
        ${"tabhash$i"}{ORGANISME} = substr($lignes, 8, 3);
     
        ############ Affectation ligne à ligne
        $tab_lignesMVS[$i] = \%{"tabhash$i"};

    par

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        $tabhash{$i}{SITE} = substr($lignes, 0,4);
        $tabhash{$i}{ANNEE} = substr($lignes, 4, 4);
        $tabhash{$i}{ORGANISME} = substr($lignes, 8, 3);
     
        ############ Affectation ligne à ligne
        $tab_lignesMVS[$i] = \%{ $tabhash{$i} };

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut
    Merci bcp Marneus, ça marche.

  13. #13
    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
    Voilà une solution plus élégante et sans doute plus robuste.

  14. #14
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Citation Envoyé par mcshu
    Merci bcp Marneus, ça marche.
    De rien, n'oublie pas,

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

Discussions similaires

  1. [JSTL] nom de variable "dynamique"
    Par gmonta31 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/05/2006, 13h31
  2. Nom de variable dynamique
    Par mavina dans le forum Linux
    Réponses: 7
    Dernier message: 26/04/2006, 20h48
  3. Réponses: 4
    Dernier message: 13/09/2005, 11h50
  4. Noms de Variables dynamiques
    Par horec dans le forum Langage
    Réponses: 7
    Dernier message: 22/07/2005, 16h47
  5. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44

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