• Publicidad

Cambiar archivo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cambiar archivo

Notapor Merisue » 2007-08-25 07:51 @368

¡Hola a todos!

Veréis, soy una negada para la informática y estoy aprendiendo a programar por primera vez.. :oops: Y tengo un problemilla para cambiar parte del contenido de un archivo..

A ver si alguno me podéis echar un cable... Es un archivo que lo abro y con la función s/// cambio varios valores del archivo pero no sé cómo cambiarlo en el archivo en sí... No sé si me explico... ¡Ayuda por favorrrrrrr!!

¡¡Gracias a todos!! :D
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Publicidad

Notapor explorer » 2007-08-25 08:09 @381

Bienvenida a los foros de Perl en Español, Merisue.

Se puede hacer de varias maneras. Si, por ejemplo, te lees todo el fichero en memoria, puedes luego abrir el mismo fichero pero en escritura y guardarlo de esta manera con los cambios hechos.

Si, en cambio, vas leyendo línea a línea, deberás antes abrir otro fichero e ir guardando en él las líneas, tanto las no cambiadas como las que sí. Al final, borrar el fichero de partida y al nuevo, darle de nombre el del viejo.

Como esta operación es muy común, Perl ofrece una forma muy cómoda de hacerla, en una sola línea, pero usando los pies.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Merisue » 2007-08-27 07:12 @342

¡Muchísimas gracias, explorer, por la ayuda y por tu rápida respuesta! Le he echado un vistazo a los pies pero me vendría mejor hacerlo de alguna de las otras dos maneras ya que lo que quiero es cambiarlo sucesivas veces con un bucle por ejemplo... el problema es que he intentado hacer lo que me sugieres y no lo consigo. me temo que no sé abrirlo en escritura para guardar los cambios.. :oops: Ya imagino que es algo básico pero no me funciona.. a ver si me podéis dar otro empujoncito... ¡¡Muchísimas gracias!!
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Notapor explorer » 2007-08-27 08:03 @377

Muéstranos el código que te falla, a ver si así descubrimos dónde está el error.

Para abrir un fichero en escritura es lo mismo que en lectura, pero cambiando el '<' por un '>'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Merisue » 2007-08-27 08:47 @407

Muchas gracias ¡lo primero de todo! Bueno, aquí os pongo mi creación frankesnteniana. Me temo que es muy chapucera y ¡debe tener multitud de errores!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Cambiamos el valor de pitch en el archivo_parámetros.
for $i (-4..0){
open (PARAMS, "PARAMS.in") or die "No se pudo abrir PARAMS.in: $!";
for $line (<PARAMS>){
$line  =~ s/(=.\d+/$i)/ or die "No se pudo cambiar el pitch:$!";
  }
close PARAMS;
open (OVERWRITE, ">PARAMS.in");
print OVERWRITE "$line \n" or die "No se pudo sobreescribir PARAMS:$!";
close OVERWRITE;
#Corre el programa prepro y genera un archivo input para FAST.
system ("c:\\perl\\bin\\perl prepro.pl PARAMS.in FAST.template $i.in") or die "No se pudo crear input para FAST: $!";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Notapor explorer » 2007-08-27 09:23 @432

Lo he reescrito, pero no lo he probado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Cambiamos el valor de pitch en el archivo_parámetros.
for $i ( -4..0 ) {

    # Lugar donde almacenamos el fichero leído y modificado
    my @params;

    # Abrimos el fichero en lectura
    open (PARAMS, "<PARAMS.in") or die "No se pudo abrir PARAMS.in: $!";

    # Para todas las líneas del fichero, hacemos el cambio
    for $line (<PARAMS>) {
        $line  =~ s/=.*\d+/= $i/ or die "No se pudo cambiar el pitch:$!";
        push @params, $line;    # Almacenamos la línea, cambiada o no
    }

    close PARAMS;

    # Grabamos el resultado
    open (OVERWRITE, ">PARAMS.in") or die "No se pudo sobreescribir PARAMS:$!";
    print OVERWRITE @params;
    close OVERWRITE;

    # Corre el programa prepro y genera un archivo input para FAST.
    system ("C:\\perl\\bin\\perl.exe prepro.pl PARAMS.in FAST.template $i.in")
        or die "No se pudo crear input para FAST: $!";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Hay dos cambios:
* Había un error en la expresión regular. Los paréntesis estaban mal puestos. La he cambiado por lo que me parece que estás intentando cambiar: aquellas líneas que tienen un '=' seguido de posiblemente varios espacios y seguido de una cifra, cambiarla por la misma línea pero poniendo en lugar de la cifra el valor de $i.
* He usado la variable @params para almacenar todas las líneas leídas del fichero. Luego, se usará para escribir el resultado.

Esto, de forma un poco más moderna, se hace con un sistema de plantillas, que reducen el anterior código a la mitad.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-08-27 09:33 @439

Pregunta curiosa... ¿Cuántas líneas tiene PARAMS.in?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Merisue » 2007-08-27 09:42 @446

Ahora mismo solo 6 pero no sé si lo haré mayor o no... Es que voy pasito a pasito dado lo negada que soy... Tengo que generar muchos archivos de input para otro programa cambiando un par de variables pero solo una al tiempo así que creo que no será mucho mayor que ahora; estimo que a lo sumo tendrá unas 10 líneas...

¡¡Muchísimas gracias, ahora mismo te digo si funciona!!
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Notapor explorer » 2007-08-27 09:54 @454

Pues entonces, sí... te merece la pena hacerlo con plantillas... ahorrarás mucho tiempo.

Quizás con el Text::Template te sirva. Si sabes/puedes instalarte este módulo, podemos probar a pasar tu programa a usar plantillas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Merisue » 2007-08-27 10:10 @465

Mmm perdona que te moleste otra vez :oops: pero me da un pequeño problemilla en la última línea system() me salta la línea de error y me dice que hay un error en dicha línea aunque sí me genera un archivo, el resto del programa va perfecto.. :D Siento ser tan pesada, ¡no me baneeis! :shock: XDDD
Merisue
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-08-24 20:13 @884

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado