Explicamos esto en profundidad en Intermediate Perl.
La sintaxis general para las búsquedas de variables es:
SIGIL BLOCK INDEXY-THING
Para un simple escalar que se parece a:
print $ { foo };
Probablemente han visto este cuando es necesario separar un nombre de variable de las cosas que rodean es:
print "abc${foo}def\n";
Si solo tiene un identificador de Perl en el bloque y sin ensuciar alrededor, puede dejar fuera de los apoyos, que es el caso común:
print $foo;
Sin embargo, esto es lo mismo para la eliminación de referencias referencia:
SIGIL BLOCK-RETURNING-REFERENCE INDEXY-THINGS
Si la cosa que se ponga en el bloque es una referencia, Perl intenta eliminar la referencia como pediste también:
my $ref = \ '12345';
print $ { $ref };
Eso es un bloque real, aunque, y no sólo el azúcar. Puede tener tantas declaraciones como quiera ahí:
print $ { my $ref = \ '1234'; $ref };
Ahora que no sólo está especificando un identificador de Perl, por lo que Perl no asume que se está dando un identificador y se ejecuta el código y usos el resultado como referencia. Considere la diferencia entre estos say
declaraciones casi idénticas:
use 5.010;
our $foo = "I'm the scalar";
sub foo { \ "I'm the sub" }
say ${foo};
say ${foo;};
En ese segundo say
Perl ve el punto y coma, se da cuenta de que no es un identificador, interpreta el código dentro de las llaves como texto, y devuelve el resultado. Como el resultado es una referencia, usa el ${...}
para desreferenciarlo. No importa dónde hagas esto, para que lo hagas dentro de una cadena de comillas dobles no es especial.
También, observe el our
allí. Eso es importante ahora que vas a considerar algo un poco más complejo:
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 ese último say
como código y ve el resultado no es una referencia; es la cadena simple foo
. Perl ve que no es una referencia, pero ahora está en un contexto de desreferenciación, por lo que hace una referencia simbólica (como Greg Bacon describes). Como las referencias simbólicas funcionan con variables en la tabla de símbolos, esa $foo
tenía que ser una variable de paquete.
Dado que es fácil estropear esto, strict
tiene un práctico control para ello. Sin embargo, cuando lo apagas, no te sorprendas cuando te muerda. :)
Usted declaró explícitamente que quería utilizar referencias simbólicas y 'perl' hizo su oferta. –
Así es como funciona la desreferenciación. Puede encontrar útil: http://perlmonks.org/?node=References+quick+reference – ysth