Locales de mantenimiento de las cosas que deberían ser locales es una buena práctica.
Técnicamente hablando, el uso local (mi) las variables se basa en la necesidad de eliminar los nombres de los enfrentamientos, pero el hecho es algo que tiene un propósito no relacionado. Es decir, para asegurarse de que el alcance de una variable sólo depende de la léxica sólo alcance. Así que usted puede decir el ámbito de aplicación de la variable directamente mirando en el bloque actual y en ninguna otra parte. Subrutinas invocarse desde dentro de este bloque, no verá la variable. tan,
Código:
{ # BLOCK 1
my $var = 10;
{ # BLOCK 2
local $var2 = 100;
&mysub;
print "\$var = $var\n"; # (1)
print "\$var2 = $var2\n"; # (2)
}
$var += 10;
print "\$var = $var\n"; # (3)
print "\$var2 = $var2\n"; # (4)
}
&mysub;
print "\$var = $var\n"; # (5)
print "\$var2 = $var2\n"; # (6)
sub mysub {
$var += 2;
$var2 += 2;
}
Usted puede decir que el alcance de "my $ var" está dentro BLOQUE 1, pero no llama a subrutinas dentro. Por lo tanto, (1) y (3) son de 10 y 20, respectivamente. Así que no mysub $ var () cambio en la subrutina? Es el mundial de $ var, que se muestra en (5), "4" (2 invocaciones) después de que el alcance de "my $ var" expira. Como usted puede estar seguro del alcance (en vez de en función de la pila de llamadas, es decir, el anidamiento de subrutinas que se llama), será más fácil cuando el valor de depuración va mal.
Perl también le da una variante de "locales" que implementa el alcance-de-atención-sobre la política de pila (raro entre los de uso común en los lenguajes de programación hoy en día), por lo que (2), (4), (6) son 102, y undef 2. Esto tiene una desventaja que el alcance depende de la pila de llamadas en tiempo de ejecución por lo que es más confusa.
Si usted necesita para hacer frente a las referencias, es posible que tenga que expirará una estructura de datos apuntado por una referencia en un momento en la vida de la secuencia de comandos mediante el control de la vida útil de las referencias. Si sus referencias son declarados como variables locales que naturalmente salir del ámbito de aplicación cuando el bloque que contiene termina y posteriormente obtener limpiado. En caso contrario, las referencias de las variables globales se mantenga en torno a menos que reasignar su valor. Que aumenta las probabilidades de enfrentamientos, si usted se olvida de hacerlo.
Pero tener en cuenta que
Perl variables globales no son verdaderamente mundial (véase el perlmod de manual), pero además sujetos al paquete (alias de nombres) mecanismo. Paquete es el nombre de método que se ocupa de los enfrentamientos. Esto es importante, ya que construir los componentes que están destinados a ser reutilizados, por lo que no queremos que el nombre definido en $ un componente utilizado para entrar en conflicto con otros $ nombre en mi programa. Pero no voy a entrar en detalles de los paquetes aquí. Perlmod ver el manual o la documentación pertinente para obtener más detalles.
Esto explica por qué usted debería tratar de poner su código en los módulos (por lo menos, en diferentes paquetes) y usar variables locales la mayor parte del tiempo. No sólo esto hace el código más reutilizable, también ayuda a evitar muchos problemas en el largo plazo, como el código se vuelve más complicada cuando se trate de cumplir los bits y piezas juntas.