Tengo un programa que tiene una cantidad de nombres de archivos configurados internamente. El programa edita una serie de archivos de configuración asociados con una cuenta de base de datos, luego cambia la contraseña de la base de datos para la cuenta de la base de datos. La lista de archivos de configuración está asociada con el nombre de la cuenta de la base de datos a través de una lista interna. Cuando procesar estos archivos, tengo el siguiente bucle en mi programa:Necesita la edición perl in place de los archivos que no están en la línea de comandos
BEGIN { $^I = '.oldPW'; } # Enable in-place editing
...
foreach (@{$Services{$request}{'files'}})
{
my $filename = $Services{$request}{'configDir'} . '/' . $_;
print "Processing ${filename}\n";
open CONFIGFILE, '+<', $filename or warn $!;
while (<CONFIGFILE>)
{
s/$oldPass/$newPass/;
print;
}
close CONFIGFILE;
}
El problema es que esto escribe la salida modificada en STDOUT, no CONFIGFILE. ¿Cómo puedo editar esto en realidad? Mueve $^I dentro del ciclo? imprimir CONFIGFILE? Estoy perplejo.
Actualización: encontré lo que estaba buscando en perlmonks. Puede usar un ARGV local dentro del ciclo para hacer la edición in situ de la manera normal. El bucle de arriba ahora se ve así:
foreach (@{$Services{$request}{'files'}})
{
my $filename = $Services{$request}{'configDir'} . '/' . $_;
print "Processing ${filename}\n";
{
local @ARGV = ($filename);
while (<>)
{
s/$oldPass/$newPass/;
print;
}
}
}
Si no fuera por que añade el ConfigDir en principio, tan sólo pudiera cara o cruz toda la lista en el @ARGV local, pero esto es lo suficientemente eficiente.
Gracias por las útiles sugerencias sobre Tie :: File, probablemente iría por ese camino si se hacía de esta manera. Los archivos de configuración que estoy editando no tienen más de unos pocos Kbytes de longitud, por lo que un Lazo no usaría demasiada memoria.
En realidad, no necesito copias de seguridad porque estos archivos están almacenados en un sistema de control de código fuente. El siguiente paso en este script es integrar el SCCS (Perforce, en este caso) en el script, de modo que se compruebe y envíe los archivos a medida que se actualicen. – Wexxor