Nous l'expliquons en détail dans Intermediate Perl.
La syntaxe générale pour les recherches variables est:
SIGIL BLOCK INDEXY-THING
Pour un scalaire simple qui ressemble à:
print $ { foo };
Vous avez probablement vu cela quand vous avez besoin de séparer un nom de variable des choses environnantes il:
print "abc${foo}def\n";
Si vous avez juste un identifiant Perl dans le bloc et pas de gâchis autour, vous pouvez laisser hors les accolades, ce qui est le cas commun:
print $foo;
Cependant, cela est la même chose pour déréférencer une référence:
SIGIL BLOCK-RETURNING-REFERENCE INDEXY-THINGS
Si la chose que vous obtenez en le bloc est une référence, Perl tente de déréférencer comme vous demande aussi:
my $ref = \ '12345';
print $ { $ref };
C'est un vrai bloc cependant, et pas seulement le sucre. Vous pouvez avoir autant de déclarations que vous aimez là:
print $ { my $ref = \ '1234'; $ref };
Maintenant, vous n'êtes pas seulement spécifier un identifiant Perl, Perl ne suppose pas que vous lui donner un identifiant et il exécute le code et les utilisations le résultat comme référence. Pensez à la différence entre ces say
presque identiques déclarations:
use 5.010;
our $foo = "I'm the scalar";
sub foo { \ "I'm the sub" }
say ${foo};
say ${foo;};
Dans ce second say
Perl voit le point-virgule, ce n'est pas réalise un identifiant, interprète le code à l'intérieur des accolades sous forme de texte, et renvoie le résultat. Puisque le résultat est une référence, il utilise le ${...}
pour le déréférencer. Peu importe où vous faites cela, de sorte que vous le faites dans une chaîne entre guillemets doubles n'est pas spécial.
Notez également le our
là. C'est important maintenant que vous allez envisager quelque chose un peu plus compliqué:
use 5.010;
our $foo = "I'm the scalar";
sub foo { \ "I'm the sub" }
sub baz { 'foo' }
say ${foo};
say ${foo;};
say ${baz;};
Perl intreprets cette dernière say
code et voit le résultat est une référence; c'est la chaîne simple foo
. Perl voit que ce n'est pas une référence mais qu'il est maintenant dans un contexte de déréférencement donc il fait une référence symbolique (comme Greg Bacon describes). Comme les références symboliques fonctionnent avec des variables de la table de symboles, cela signifie que $foo
devait être une variable de package.
Puisqu'il est facile de tout gâcher, strict
a un contrôle pratique pour cela. Cependant, lorsque vous l'éteignez, ne soyez pas surpris quand il vous mord. :)
Vous avez explicitement déclaré que vous vouliez utiliser des références symboliques et 'perl' a fait votre offre. –
Voilà comment fonctionne le déréférencement. Vous pourriez trouver utile: http://perlmonks.org/?node=References+quick+reference – ysth