Lo primero de todo... debes entender por qué usamos local()... porque... en realidad, no haría falta en muchas situaciones.
Respondiendo primero a tus preguntas: sí: la modificación de la variable afecta a todos los archivos abiertos y los que se vayan a abrir.
Todos. Hasta el final del programa, o hasta que se recupere el valor inicial de
$/.
Para que quede más claro: cambiar el valor a
$/ a 'undef' no "activa" ningún "modo aspiradora", sino que le estamos diciendo a Perl que en cuanto le demos la orden de que lea un archivo, como hemos indefinido el delimitador de registros, lo leerá todo de golpe. Este comportamiento es como si hubiéramos puesto en marcha una aspiradora, por lo que, de forma graciosa, en la documentación se llama a esto "activar el modo aspiradora". Pero realmente solo estamos dándole un determinado valor a
$/ para que se comporte así.
Supongamos que estamos en una situación en la cual el archivo que vamos a leer no tiene registros de entrada (las líneas de un archivo de texto serían los registros de ese archivo, separados con delimitadores -los caracteres de final de línea-), y decidimos que queremos leer todo el archivo de golpe, a una variable escalar. Bien porque tenemos memoria física para eso, o por simple comodidad (a veces es más fácil procesar todo el archivo, entero).
Entonces, siguiendo la documentación, podemos escribir esto:
Using perl Syntax Highlighting
use autodie;
open my $ARCHIVO, '<', 'archivo.txt';
undef $/; # estas dos líneas hacen lo mismo: poner 'undef' en $/
$/ = undef; # podemos elegir cualquiera de ellas
my $archivo = <$ARCHIVO>; # leemos todo el archivo
close $ARCHIVO;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya tenemos a todo $archivo leído. (La tercera línea del código tuyo, es solo un ejemplo de lo que se puede hacer con el archivo leído. En ese caso, aplicar una expresión regular, que hace la sustitución de un conjunto de espacios en uno solo -es decir: que convierte a un texto en una sola línea-).
Pero... hay un "pequeño" problema...
Si el programa no tiene que leer más archivos, no pasa nada. Pero si tiene que leer más, tenemos el problema de que venimos con el valor de
$/ cambiado... y a lo mejor el siguiente archivo a leer no queremos "aspirarlo", sino leerlo como un archivo de texto normal.
Entonces... deberíamos darle a
$/ el valor que tenía
antes, ya que sabemos que era el valor normal de caracteres de fin de línea.
Pero... ¿cuál? Eso depende del sistema operativo.
Si estamos en Linux, podemos hacer un
$/ = "\n" y ya está. Pero entonces... nuestro programa ya no es portátil (no se puede llevar de un sistema operativo a otro) sin que tengamos que reeditarlo y cambiar esa línea.
Más cómodo es hacer esto: al principio del programa podemos ver qué valor tiene
$/. Perl sabe en qué sistema operativo está y entonces sabe cuál es el delimitador por defecto para los caracteres de fin de línea.
Using perl Syntax Highlighting
my $valor_anterior_RS = $/;
# ... resto del programa
# antes de abrir un archivo de texto, hacemos
$/ = $valor_anterior_RS;
# ya podemos abrir archivos normales
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya está resuelto: ya tenemos una forma de regresar a
$/ el valor original.
Pero estamos en Perl... siempre hay otra manera de hacerlo, más cómoda.
La clave está en las llaves (
{}). Para Perl, representan un "contexto" de trabajo o entorno de trabajo de las variables.
Toda variable local (declarada con my()) dentro de un par de llaves es destruida al final de ese contexto, y no conocida fuera de él. Es una buena forma de usar la variable $i en varios sitios donde necesitemos variables tontas para hacer cosas simples.
Pero hay otra forma de crear variables locales... y es con local().
local() no crea nuevas variables, sino que guarda los valores de las variables actuales en una pila aparte, y les asigna nuevos valores para ese contexto. Una vez que termina el contexto, se recuperan los valores originales.
Se usa también para cuando queremos que variables locales sean visibles dentro de subrutinas que llamemos (también, dentro del contexto).
Entonces, podemos reescribir el programa así:
Using perl Syntax Highlighting
use autodie;
open my $ARCHIVO, '<', 'archivo.txt';
my $archivo; # aquí lo guardaremos
{ # creamos un contexto
local $/ = undef; # creamos una variable local
# el valor anterior de $/ es guardado
# el valor inicial de $/ será 'undef'
$archivo = <$ARCHIVO>; # leemos todo el archivo
} # cerramos el contexto, $/ (local) se destruye, y $/ (global) recupera su valor original
close $ARCHIVO;
# aquí podemos abrir otro archivo, ya de forma normal, ya que $/ tiene el valor correcto
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Si no le damos a local() un valor inicial, toma 'undef', así que la línea anterior se puede reducir a
Using perl Syntax Highlighting
local $/;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Más información sobre local() en tu propio ordenador en
perldoc perlsub,
y en la Web.