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 :

questions sur les références symboliques


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut questions sur les références symboliques
    http://www.bribes.org/perl/docfr/perlref.html#LE61666C2
    Références symboliques

    Nous avons déjà expliqué que, quand c'est nécessaire, les références devenaient existantes si elles sont définies, mais nous n'avons pas dit ce qui arrivait lorsqu'une valeur utilisée comme référence est déjà définie mais n'est pas une référence dure. Si vous l'utilisez comme référence dans ce cas-là, elle sera traitée comme une référence symbolique. C'est-à-dire que la valeur du scalaire est considérée comme le nom d'une variable, plutôt que comme un lien direct vers une (éventuelle) valeur anonyme.

    En général, les gens s'attendent à ce que ça fonctionne de cette façon. C'est donc comme ça que ça marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1    $name = "foo";
    2    $$name = 1;                 # Affecte $foo
    3    ${$name} = 2;               # Affecte $foo
    4    ${$name x 2} = 3;           # Affecte $foofoo
    5    $name->[0] = 4;             # Affecte $foo[0]
    6    @$name = ();                # Efface @foo
    7    &$name();                   # Appelle &foo() (comme en Perl 4)
    8    $pack = "THAT";
    9    ${"${pack}::$name"} = 5;    # Affecte $THAT::foo sans évaluation
    Mes questions et mes suppositions sont mises en vert
    Donc, si j'ai bien compris ...
    une valeur utilisée comme référence ($$name ligne 2) est déjà définie mais n'est pas une référence dure ($name ligne 1 = scalaire).

    Si vous l'utilisez comme référence dans ce cas-là, elle sera traitée comme une référence symbolique. C'est-à-dire que la valeur du scalaire ("foo" ligne 1) est considérée comme le nom d'une variable, plutôt que comme un lien direct vers une (éventuelle) valeur anonyme (table des symboles *foo = foo).


    Danger :
    Seules les variables (globales, même si elles sont localisées) de paquetage sont visibles par des références symboliques. Les variables lexicales (déclarées avec my()) ne font pas partie de la table des symboles, et sont donc invisibles à ce mécanisme. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        local $value = 10;
        $ref = "value";
        {
            my $value = 20;
            print $$ref;
        }
    Ceci imprimera 10 et non pas 20. Souvenez-vous que local() affecte les variables de paquetage, qui sont toutes «globales» au paquetage.
    Problème : my $value = 20; étant lexicale, elle ne fait pas partie de la table des symboles et est donc invisible par la référence symbolique $ref.

    ... je ne comprends pas la ligne $ref = "value"; ... comment Perl est-il sensé savoir que $ref est une référence? Pourquoi ne pas mettre $ref = \$value? Est-ce grâce à 'local $value' qui est placée dans la table des symboles et qui permet par la suite à $ref de savoir via $ref = "value" qu'il est une référence? Car *value = value est dans cette table.


    ... je suis perdue ...


    Dans la FAQ
    Comment générer automatiquement une fonction ?

    auteur : Woufeil
    En bouclant autour d'une fermeture, on peut créer des fonctions ayant un code semblable mais des noms différents. Le problème est qu'une fermeture n'a pas de nom, mais on peut le contourner : il est en effet possible de lier une référence de code à un nom déjà existant en passant par les typeglobs.
    Par exemple, on veut deux fonctions fic1 et fic2 qui écrivent leurs paramètres dans des fichiers qui ont respectivement pour handle FIC1 et FIC2. Les 2 fonctions sont très proches, elles ne diffèrent que par le fichier dans lequel écrire. Voilà comment générer ces deux fonctions en bouclant autour d'une fermeture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach my $champ (qw(fic1 fic2))
    {
    	my $handle = uc $champ; #met $champ en majuscule
    	no strict 'refs'; #Autorise les références symboliques
    	*$champ = sub {print $handle "@_";}; #affecte la fermeture en question au typeglob
    }
    fic1("Salut !"); #écrit salut dans FIC1
    Citation Envoyé par Woufeil
    il est en effet possible de lier une référence de code à un nom déjà existant en passant par les typeglobs.
    Donc, ici on parle bien de références symboliques?


    Donc pour conclure : les références symboliques sont utiles comme dans ce cas-ci mais peuvent être dangereuses car il faut garder à l'esprit que les variables lexicales ne sont pas visibles par ces références.


    Une seule question est vraiment importante, qu'est-il important de retenir au sujet des références symboliques?



    Merci pour votre aide,

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Une seule question est vraiment importante, qu'est-il important de retenir au sujet des références symboliques?
    Tu n'as rien besoin de savoir à propos des références symboliques à part qu'il ne faut pas les utiliser.

    Citation Envoyé par Jasmine80 Voir le message
    Donc, si j'ai bien compris ...
    une valeur utilisée comme référence ($$name ligne 2) est déjà définie mais n'est pas une référence dure ($name ligne 1 = scalaire).

    Si vous l'utilisez comme référence dans ce cas-là, elle sera traitée comme une référence symbolique. C'est-à-dire que la valeur du scalaire ("foo" ligne 1) est considérée comme le nom d'une variable, plutôt que comme un lien direct vers une (éventuelle) valeur anonyme
    C'est exact, en bref, lorsque tu tentes de déréférencer un scalaire, si le scalaire n'est pas une référence (c'est à dire une string ou un nombre) alors tu utilises une référence symbolique plutôt qu'une référence dure.

    Citation Envoyé par Jasmine80 Voir le message
    ... je ne comprends pas la ligne $ref = "value"; ... comment Perl est-il sensé savoir que $ref est une référence? Pourquoi ne pas mettre $ref = \$value? Est-ce grâce à 'local $value' qui est placée dans la table des symboles et qui permet par la suite à $ref de savoir via $ref = "value" qu'il est une référence? Car *value = value est dans cette table.
    $ref n'est pas une référence ! C'est une string parfaitement ordinaire. Et parce que ce n'est pas une référence, lorsqu'on tente de la déréférencer avec $$ref, Perl se rabat sur le système des références symboliques et utilises la valeur string de $ref "value" pour retrouver la valeur correspondante dans la table de symboles (qui ne contient pas les variables lexicales, ce qui explique pourquoi la valeur retrouvée est celle de la variable globale $value et pas celle de la variable locale $value déclarée avec un my() ).


    Citation Envoyé par Jasmine80 Voir le message
    Donc, ici on parle bien de références symboliques?
    *$champ est une référence symbolique parce que $champ est une string ordinaire, et *$champ est un déréférencement.

    Citation Envoyé par Jasmine80 Voir le message
    Donc pour conclure : les références symboliques sont utiles comme dans ce cas-ci mais peuvent être dangereuses car il faut garder à l'esprit que les variables lexicales ne sont pas visibles par ces références.
    Cet exemple travaille directement sur les entrailles de Perl, la table de symbole et tout le tralala, tu n'as normalement jamais besoin des références symboliques, je doute fortement que tu en aies jamais besoin.
    Note d'ailleurs qu'on peut faire cet exemple sans références symboliques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach my $champ (qw(fic1 fic2))
    {
    	my $handle = uc $champ; #met $champ en majuscule
    	$::{$champ} = sub {print $handle "@_";};
    }
    Manipulation directe de la table de symbole.

    --
    Jedaï

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Jedai
    tu n'as normalement jamais besoin des références symboliques, je doute fortement que tu en aies jamais besoin.
    Oui, tu as entièrement raison. Je n'en ai d'ailleurs jamais utilisé et je n'en utiliserai probablement jamais. Merci pour tes explications maintenant je saurai au moins de quoi on parle quand je reverrai 'référence symbolique'.

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

Discussions similaires

  1. Question sur les références
    Par Cbonniot dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 22/01/2010, 10h41
  2. Questions sur les références
    Par Az3l_ dans le forum C++
    Réponses: 2
    Dernier message: 11/01/2009, 01h55
  3. Question sur les références.
    Par AsmCode dans le forum C++
    Réponses: 5
    Dernier message: 21/02/2007, 19h57
  4. Encore une question sur les références
    Par bouba dans le forum C++
    Réponses: 7
    Dernier message: 19/02/2007, 14h16
  5. Question sur les références
    Par vdumont dans le forum C++
    Réponses: 7
    Dernier message: 05/05/2006, 01h49

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