2012-08-24 7 views
5

Disculpe porque la pregunta no sea clara, pero la estoy preguntando, porque no me gusta leer y no entiendo de lo que estoy leyendo.La razón por la cual typeglobs se puede usar como referencia en Perl

Aquí es el fragmento de la "programación Perl":

Desde el modo en que deja de hacer referencia siempre hay algo que indica qué tipo de referente estás buscando, un typeglob se puede utilizar la de la misma manera que una referencia puede, a pesar de que un typeglob contiene múltiples referentes de varios tipos. Así que $ {* main :: foo} y $ {\ $ main :: foo} ambos acceden a la misma variable escalar, aunque este último es más eficiente.

Para mí aparece una especie de mal, y que sería correcto si fuera así de esta manera:

puede utilizar un typeglob en lugar de la variable escalar debido referencia es siempre un escalar y el compilador sabe lo que necesita

Causa del lector de texto del libro puede suponer que la referencia puede ser algo más que una variable escalar (es decir, entrada escalar en la tabla simbólica). Una vez que vi una advertencia: use of array as a reference is deprecated, me parece que hace mucho tiempo este párrafo en "Programming Perl" era significativo, porque las referencias podrían ser no solo un escalar, sino que en la nueva edición 4 era simplemente no modificado para cumplir con Perl moderno.

He revisado la página de erratas para este libro, pero no he encontrado nada.

¿Mi suposición es correcta? Si no, sería alguien tan agradable de explicar, donde estoy equivocado.

Gracias de antemano.

Respuesta

15

No. Lo que está diciendo es que a diferencia de una referencia normal, un typeglob contiene múltiples tipos de cosas al mismo tiempo. Pero la forma en que deferenciarlo indica el tipo de cosa que usted quiere:

use strict; 
use warnings; 
use 5.010; 

our $foo = 'scalar'; 
our @foo = qw(array of strings); 
our %foo = (key => 'value'); 

say ${ *foo };     # prints "scalar" 
say ${ *foo }[0];    # prints "array" 
say ${ *foo }{key};    # prints "value" 

que no es necesario un "typeglob dereferencing sintaxis" especial porque la sintaxis normal de eliminación de referencias ya indica qué ranura de la typeglob desea para desreferenciar

Tenga en cuenta que esto no funciona con las variables my, porque las variables léxicas no están asociadas con typeglobs.

Nota: La advertencia de "matriz como referencia" no está relacionada con esto. Se refiere a esta sintaxis: @array->[0] (que significa lo mismo que $array[0]). Esa nunca fue la intención de ser una sintaxis válida; se coló en el analizador Perl 5 por accidente y quedó en desuso una vez que Larry se dio cuenta.

+0

Debería leerlo como 'Pero la forma en que deferenciarlo indica qué tipo de referencia será creado implícitamente? – user907860

+2

@ caligula, no, porque no está creando una referencia. Un typeglob ya es un tipo de referencia. Solo está seleccionando la ranura para desreferenciar. – cjm

1

aunque esto no responde exactamente a su pregunta, puedo tratar de decirle lo que experimento con typeglobs

que son más dinámicos que los escalares y referencias, porque el uso de un typeglob es una especie de una manera decirle al compilador "Aquí hay una pista, adivina qué tienes que hacer con eso"

una referencia siempre tiene un tipo estricto y un objetivo. un typeglob solo puede contener una cadena, lo que indica que se supone que apunta a alguna variable (nombre) o filehandle (como STDOUT) o algún otro valor, que está accesible a través de esta cadena

existen hacks perlish para lograr cosas extrañas, eso solo es posible con typeglobs, entonces creo que incluso en Mordern Perl son importantes

1

PerlGuts illustrated es una forma accesible de aprender sobre las partes internas de Perl.

http://www.cpan.org/authors/id/GAAS/illguts-0.09.pdf

Las respuestas dadas hasta ahora son ilustrativos de lo que está pasando, pero aprender cómo las variables almacena Perl le permitirá ver la respuesta es realmente muy simple y analogías son en realidad menos clara que la puesta en práctica.

PS: Usted es recomendable en querer entender - que nos situará en una buena posición para el futuro :)

+0

enlace roto. :( – badp

Cuestiones relacionadas