Perl tiene dos sistemas de variables totalmente independientes pero en gran medida compatibles, variables de paquete, como en el primer ejemplo, y léxica variables, como en el segundo. Hay algunas cosas que cada uno puede hacer, pero la otra no puede:
variables de paquete son los únicos que pueden ser:
- localizada (con
local
)
- utilizar como destino para una referencia simbólica (la razón por la segunda obra duerma ejemplo de la OP)
- utilizado como barewords (definiciones sub, manejadores de archivo)
- utilizarse con typeglobs (porque eso es lo que realmente es el símbolo debajo del capó)
Las variables léxicas son las únicas que se pueden cerrar (se utilizan en un cierre léxico).
El uso estricto ayudaría forzándolo a declarar las variables del paquete con our
, haciendo la diferencia más clara.
Hay varios momentos en los que las referencias simbólicas son útiles en Perl, la mayoría se centran en la manipulación de la tabla de símbolos (como escribir su propio import
en un módulo en lugar de utilizar Exporter
,, varias otras tareas de programación meta mono-parches módulos en tiempo de ejecución) Todos estos son temas avanzados.
Para otras tareas, generalmente hay una mejor manera de hacerlo, como con un hash. La regla general es ejecutar siempre bajo use warnings; use strict;
a menos que sepa que no hay otra forma más que deshabilitar una parte del pragma (como usar no strict 'refs';
en un alcance tan pequeño como sea posible).
Supongo que $ answer define un alcance global, y mi $ answer define un ámbito local. –
@Paul, pero print $ answer funcionaría bien .... ¿cómo $ {$ variable} crea un ámbito global? – ennuikiller
Siempre use 'use strict; usa advertencias; 'y nunca verás este problema. Aún mejor, nunca use el valor de una variable para obtener otra variable. Hashes es mucho mejor. – Ether