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 :

Substitution variables dans hash


Sujet :

Langage Perl

  1. #1
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut Substitution variables dans hash
    Voilà mon petit problème : je cherche à substituer dans un hash (issu d'un fichier xml) des variables. Concrètement :

    j'ai des valeurs dans mon hash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $hash = {
                      'num_carte'   => 4,
                      'num_acces'  => 1,
                      ....
                      'interface'   => '$num_carte/$num_acces'
    }
    Et je veux substituer $num_carteet $num_accesavec les valeurs présentes dans le hash.
    ça fonctionne très bien dans le cas d'une variable seule, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $hash = {
                      'num_carte'   => 4,
                      'num_acces'  => 1,
                      ....
                      'interface'   => '$num_carte'
    }
    qui devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $hash = {
                      'num_carte'   => 4,
                      'num_acces'  => 1,
                      ....
                      'interface'   => 4
    }
    Mais avec mon premier exemple, ça ne fonctionne pas bien...
    Avec la regexp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $structure->{$cle} =~ s/\$(\S+?)[^\S]?/$valeurs->{$1}/g;
    J'ai le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $hash = {
                      'num_carte'   => 4,
                      'num_acces'  => 1,
                      ....
                      'interface'   => 'um_carte/um_acces'
    }
    Et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $structure->{$cle} =~ s/\$(\S+?)\//$valeurs->{$1}/g;
    J'ai évidemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $hash = {
                      'num_carte'   => 4,
                      'num_acces'  => 1,
                      ....
                      'interface'   => '4/$num_acces'
    }
    Quelqu'un pour m'aider sur la regexp ?
    Verre vide je te plains, verre plein, je te vide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Réponse peut être précipitée mais si tu fais ceci, qu'est-ce que ça donne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    my $hash = {
                      'num_carte'   => 4,
                      'num_acces'  => 1,
                      ....
                      'interface'   => '$num_carte/$num_acces'
    }
     
    # pour afficher "4/1" :
    $hash{interface} = "$hash{num_carte}/$hash{num_acces}";
     
    # si c'est pour produire le résultat de 4 / 1 :
    $hash{interface} = $hash{num_carte}/$hash{num_acces};

  3. #3
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    Merci pour ta réponse.
    Ce que je veux, c'est bien une chaine de caratères, pas le résultat de la division.
    Ta solution pourrait être bonne si je connaissais si les variables à substituer étaient à chaque fois les mêmes, mais ce n'est pas le cas, je veux substituer toutes les variables de ma structure sans exception.
    En fait, je parcours ma structure (récursivement) comme un arbre et je substitue les feuilles si je trouve des variables.
    Il s'agit juste d'une problème de regexp mais j'ai un peu de mal à m'en tirer...
    Verre vide je te plains, verre plein, je te vide.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    J'ai du mal à comprendre.

    S'agit-il d'un hash simple contenant juste une paire de clés/valeurs ou bien est-ce plus un hash de hash ?

    Et pour tes deux clés 'num_carte' et 'num_acces', est-ce bien ces clés là, nommées telles quelles, dont tu cherches la valeur pour alimenter ta clé 'interface' ?

    Désolé, j'avoue avoir du mal à comprendre pourquoi tu es obligé de passer par une regexp. Si c'est un hash de hash, une boucle foreach et zouuuuuu, roule ma poule

  5. #5
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par Arioch
    J'ai du mal à comprendre.

    S'agit-il d'un hash simple contenant juste une paire de clés/valeurs ou bien est-ce plus un hash de hash ?

    Et pour tes deux clés 'num_carte' et 'num_acces', est-ce bien ces clés là, nommées telles quelles, dont tu cherches la valeur pour alimenter ta clé 'interface' ?

    Désolé, j'avoue avoir du mal à comprendre pourquoi tu es obligé de passer par une regexp. Si c'est un hash de hash, une boucle foreach et zouuuuuu, roule ma poule

    - il s'agit d'un hash de hash
    - dans le cas de la clé 'interface', il s'agit bien des cles 'num_carte' et 'num_acces', mais je ne vais pas m'amuser à coller obligatoirement à chaque structure pour faire ces substitutions, ce que je veux, c'est avoir un code qui puisse s'adapter à toute structure de hash. Et je suis juste embêté pour substituer une variable du type de '$num_carte/$num_acces' car pour toutes les autres variables '$num_carte' ou '$toto', je n'ai pas de souci avec la regexp simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $structure->{$cle} =~ s/\$(\S+)/$valeurs->{$1}/g;

    Pour être plus précis, j'ai les tables suivantes en entreé de ma fonction 'SubstituerLesVariables' :
    1) la table pour les valeurs
    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
    $VAR1 = {
              'acces_loc' => '4',
              'dna_dist' => '2080555555555',
              'num_carte_loc' => '4',
              'cos_loc' => 'LAN OPTION PRENIUM',
              'scenario' => 'ADD_PROD_DLCI',
              'CIR_loc' => '1024',
              'FrSize_loc' => '2200',
              'Dlci_dist' => '111',
              'lar_loc' => '1920',
              'nortel_loc' => 'BRNN1',
              'chanel_loc' => '',
              'Dlci_Loc' => '110',
              'E10_loc' => ''
            };
    2) la structure dans laquelle je dois substituer les variables à partir des valeurs de la table 1 :
    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
    $VAR1 = {
              'OPERATION_CODE' => 'NORTEL_CREATION_DLCI_MASSE',
              'COMMENTARY' => 'operation lancee sur $nortel_loc',
              'OPT_PARAMS' => {
                                'acces_loc' => {
                                                 'LIB_EXCEL' => 'Port1',
                                                 'DEFAULT_VALUE' => {}
                                               },
                                'Type_loc' => {
                                                'LIB_EXCEL' => {},
                                                'DEFAULT_VALUE' => 'MASTER'
                                              },
                                'dna_dist' => {
                                                'LIB_EXCEL' => 'dna_dist',
                                                'DEFAULT_VALUE' => {}
                                              },
                                'num_carte_loc' => {
                                                     'LIB_EXCEL' => 'Noli1',
                                                     'DEFAULT_VALUE' => {}
                                                   },
                                'cos_loc' => {
                                               'LIB_EXCEL' => 'COS1',
                                               'DEFAULT_VALUE' => 'LAN OPTION PREMIUM'
                                             },
                                'CIR_loc' => {
                                               'LIB_EXCEL' => 'CIR1',
                                               'DEFAULT_VALUE' => {}
                                             },
                                'FrSize_loc' => {
                                                  'LIB_EXCEL' => '2200a',
                                                  'DEFAULT_VALUE' => {}
                                                },
                                'Dlci_dist' => {
                                                 'LIB_EXCEL' => 'DLCI2',
                                                 'DEFAULT_VALUE' => {}
                                               },
                                'lar_loc' => {
                                               'LIB_EXCEL' => 'LAR1',
                                               'DEFAULT_VALUE' => {}
                                             },
                                'nortel_loc' => {
                                                  'LIB_EXCEL' => 'CM1',
                                                  'DEFAULT_VALUE' => {}
                                                },
                                'chanel_loc' => {
                                                  'LIB_EXCEL' => 'Canal1',
                                                  'DEFAULT_VALUE' => {}
                                                },
                                'Dlci_Loc' => {
                                                'LIB_EXCEL' => 'DLCI1',
                                                'DEFAULT_VALUE' => {}
                                              },
                                'nortel_ref' => {
                                                  'LIB_EXCEL' => {},
                                                  'DEFAULT_VALUE' => '$nortel_loc'
                                                },
                                'dna_loc' => {
                                               'LIB_EXCEL' => 'dna_loc',
                                               'DEFAULT_VALUE' => {}
                                             },
                                'E10_loc' => {
                                               'LIB_EXCEL' => 'E1_1',
                                               'DEFAULT_VALUE' => {}
                                             }
                              },
              'NB_COMPOSANTS_TOUCHES' => '2',
              'TYPE_COMP' => {
                               'TRSIFPE.NATURE' => '1',
                               'PE.HOSTNAME' => '$nortel_loc',
                               'COMPONENT_TYPE' => 'PE interface',
                               'TRSIFPE.NAME' => '$num_carte_loc/$acces_loc'
                             },
              'name' => 'ADD DLCI UNI (MASSE)'
            };
    Le code de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sub SubstituerLesVariables {
     
    	my ($valeurs,$structure) = @_;
    	foreach my $cle (keys (%$structure)) {
    		if (ref ($structure->{$cle}) =~ /HASH/) {# on suit la branche
    			 SubstituerLesVariables($valeurs,$structure->{$cle});
    		} else { # on substitue la feuille si besoin
    			 $structure->{$cle} =~ s/\$(\S+?)\//$valeurs->{$1}/g;
    		}	
    	}
    }
    Verre vide je te plains, verre plein, je te vide.

  6. #6
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    à tout hasard, si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $structure->{$cle} =~ s!\$([\w_]*)!$valeurs->{$1}!g;
    Voilà, ca m'a l'air mieux pour ce que tu veux, non ?

  7. #7
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par Mr6
    à tout hasard, si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $structure->{$cle} =~ s!\$([\w_]*)!$valeurs->{$1}!g;
    Voilà, ca m'a l'air mieux pour ce que tu veux, non ?

    Waaahou !! C'est magique !!
    J'avais pas pensé au '\w'...
    Je ne savais que l'on pouvait utiliser des '!'...
    ça a une signification différente des '/'.
    Verre vide je te plains, verre plein, je te vide.

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    non, c'est juste que tu choisis ce que tu veux comme séparateur tu aurais aussi pu mettre des # par exemple

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par Mr6
    à tout hasard, si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $structure->{$cle} =~ s!\$([\w_]*)!$valeurs->{$1}!g;
    Voilà, ca m'a l'air mieux pour ce que tu veux, non ?
    Pourquoi ?!
    Ca ne suffit pas?
    \w est équivalent avec [a-zA-Z0-9_], mais vous le savez déjà .

    lami20j
    --
    lami20j

  10. #10
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    me rappelais plus que le "_" était compris dans \w

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

Discussions similaires

  1. problème variable dans substitution par regex
    Par gorgonite dans le forum Langage
    Réponses: 2
    Dernier message: 26/12/2007, 12h31
  2. [LG]variables dans procédure
    Par néo333 dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2003, 23h24
  3. comment recuperer une variable dans flash
    Par krépuscul dans le forum Flash
    Réponses: 30
    Dernier message: 16/10/2003, 09h40
  4. Réponses: 13
    Dernier message: 14/06/2003, 22h15
  5. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53

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