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 l'utilisation des références sur table de hachage entres fonctions


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut Question sur l'utilisation des références sur table de hachage entres fonctions
    Bonjour,

    je suis confronté à un problème de compréhension.

    Je déclare une table de hachage dans une fonction, passe une référence à cette table à une seconde fonction qui modifie son contenu.
    Si je ne retourne pas une référence de la table de hachage à la fonction appelante, je ne dispose pas du contenu modifié.

    Je pensais qu'en utilisant les références, la fonction appelante disposerait automatiquement du contenu modifié par la fonction appelée.

    Merci pour vos lumières et éclaircissements.

    Source:
    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
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use feature 'say';
    use Data::Dumper;
     
    sub process {
        my %h_ind;
     
        $h_ind{'courrier'} = 0;
     
        say 'dump départ fonction';
        print Dumper(%h_ind) . "\n";
     
        my $ref = f1 ( \%h_ind);
     
        say 'dump retour fonction';
        print Dumper(%h_ind) . "\n";
     
        %h_ind = %$ref;
        say 'dump retour fonction avec déréférencement variable de retour';
        print Dumper(%h_ind) . "\n";
    }
     
    sub f1 {
        my ( $r_h ) = @_;
     
        my %h = %$r_h;
     
        $h{'personne'} = 0;
        $h{'document'} = 0;
     
        say 'dump dans fonction';
        print Dumper(%h) . "\n";
     
        return \%h;
    }
     
    sub main {
        process();
    }
     
    exit main(@ARGV);
    Exécution :
    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
     $ ./test_refs.pl
    dump départ fonction
    $VAR1 = 'courrier';
    $VAR2 = 0;
     
    dump dans fonction
    $VAR1 = 'courrier';
    $VAR2 = 0;
    $VAR3 = 'document';
    $VAR4 = 0;
    $VAR5 = 'personne';
    $VAR6 = 0;
     
    dump retour fonction
    $VAR1 = 'courrier';
    $VAR2 = 0;
     
    dump retour fonction avec déréférencement variable de retour
    $VAR1 = 'courrier';
    $VAR2 = 0;
    $VAR3 = 'document';
    $VAR4 = 0;
    $VAR5 = 'personne';
    $VAR6 = 0;

  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
    Dans la fonction F1, la ligne:
    fait une copie locale du contenu de ton hachage. Du coup, cette copie locale disparaît quand tu sors de F1.

    Pour impacter le hachage d'origine, il faut modifier directement le hachage référé par le paramètre reçu. Par exemple, essaie ceci (non testé, je ne peux tester maintenant):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub f1 {
        my ( $r_h ) = @_;
     
        $r_h->{'personne'} = 0;
        $r_h->{'document'} = 0;
     
        say 'dump dans fonction';
        print Dumper(%h) . "\n";
     }

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    La notion de copie locale m'avait totalement échappé.
    Après la mise à jour que tu m'a suggérée, cela fonctionne parfaitement.

    Un grand MERCI à toi

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

Discussions similaires

  1. [JpGraph] l'affichage des dates sur l'axe des x sur jpgraph
    Par essabri dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 13/10/2016, 02h45
  2. Incompréhension sur une utilisation des références
    Par abc.xyz dans le forum Langage
    Réponses: 1
    Dernier message: 27/04/2016, 09h40
  3. des tuto sur l'utilisation des composant ado
    Par kroma23 dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/11/2008, 08h51

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