• Publicidad

Cómo agregar una línea nueva a un documento

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

Cómo agregar una línea nueva a un documento

Notapor haganex » 2012-08-27 22:31 @980

Chicos, ¿cómo están? Espero que bien. De antemano, muchas gracias por ayudar. Y vuelvo a recurrir a ustedes.

Esta vez lo que necesito hacer es agregar una nueva línea con algo que me llega por parámetro a un documento. En este caso en particular es /etc/hosts. He logrado ingresar lo que necesito y agregarlo en un archivo X pero no entiendo cómo leer el archivo y decir en qué lugar en específico deseo poner la información que recibo.

Espero su ayuda.

¡ Saludos !

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. print "escribe la dirección IP, por favor: ";
  4. chop ($file=<STDIN>);
  5.  
  6. open (A,">>host");
  7. print A "$file  localhost.localdomain\n";
  8. close(A);
  9.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
haganex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-08-25 08:15 @385

Publicidad

Re: Cómo agregar una línea nueva a un documento

Notapor explorer » 2012-08-28 09:22 @432

Lo que muestras agrega la línea nueva al final del archivo hosts.

Si lo que quieres es colocar la línea nueva en otra parte del archivo, lo recomendado es leer todo el archivo en memoria, luego, abrir el archivo en modo escritura e ir grabando todas las líneas leídas antes, pero cuando localicemos la posición de la nueva línea, imprimir el nuevo contenido, y terminar con el resto de líneas.

Esto es peligroso: si ocurriese un apagón del sistema en mitad de esta operación, se perdería todo el archivo hosts.

Por eso, hay otra variante:

  • abres en lectura el hosts
  • abres en escritura el hosts.tmp
  • línea por línea, vas leyendo de uno y escribiendo en el otro
  • si la línea corresponde con la posición de la línea nueva, la imprimimos también
  • así hasta el final del primer archivo
  • cerramos archivos
  • renombramos hosts.tmp a hosts
Así, el paso de un archivo a otro es muy rápido. Y nunca se perderían los contenidos originales de hosts.

Si el cambio es sencillo, incluso no haría falta escribir programa alguno: con la opción '-i' de perl, se podría editar el archivo hosts en sí mismo.
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

Re: Cómo agregar una línea nueva a un documento

Notapor haganex » 2012-08-28 14:42 @654

Muchas gracias por la respuesta.

Te explico el porqué necesito hacer esto.

En uno de los laboratorios de una universidad donde estudio tenemos la base de datos en una MV y ocupamos un IDE que está en Windows. Entonces tenemos que editar el documento hosts de Linux con la IP dinámica que se genera para poder acceder a la base de datos, y el propósito del programa es que solamente nos pida la IP y automáticamente agregue la línea.

Ya solucioné el problema pero la forma yo creo que no es la más eficiente.

Almaceno cada dato que ya se encuentra en el documento, manualmente, y lo que hace es reescribir el documento por completo agregando la nueva línea entremedio.

La idea es leer el programa como bien dices con un while($linea = <host>) pero no tengo ningún dato que pueda leer y luego decir que me agregue la línea que yo necesito.

Espero que me puedas ayudar con la información que he proporcionado y con el programa que dejo más abajo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. print "escribe la dirección IP, por favor: ";
  4. chop ($file=<STDIN>);
  5. $var1="# Do not remove the following line, or various programs\n";
  6. $var2="# that require network functionality will fail.\n";
  7. $var3="127.0.0.1 localhost.localdomain localhost\n";
  8. $var4="::1 localhost6.localdomain6 localhost6\n";
  9. open (A,">>/etc/hosts");
  10. print A "$var1";
  11. print A "$var2";
  12. print A "$var3";
  13. print A "$file  localhost.localdomain\n";
  14. print A "$var4";
  15. close(A);
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡¡ Saludos !!!
haganex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-08-25 08:15 @385

Re: Cómo agregar una línea nueva a un documento

Notapor explorer » 2012-08-28 20:04 @878

Estás añadiendo líneas, igual que en el primer programa.
Así, el hosts va creciendo en cada ejecución. Deberías cambiar '>>' por '>'.

Esta es una posible solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. # Modifica el archivo /etc/hosts,
  4. # agregando una nueva entrada o sobreescribiendo o borrándola.
  5. #
  6. # Joaquín Ferrero. 20120829
  7. #
  8. use File::Slurp;
  9.  
  10. ## Configuración
  11. my $archivohost = '/etc/hosts';                         # Archivo a modificar
  12. my $nuestrohost = 'nosotros.universidad.co';            # Nombre del host que vamos a modificar
  13.  
  14. ## Leemos el archivo
  15. my $hosts = read_file($archivohost);
  16.  
  17. ## Preguntamos la nueva IP
  18. print "Introduzca nueva IP para $nuestrohost (nada=borrar entrada): ";
  19. chomp (my $IP = readline);
  20.  
  21. ## Hacemos el cambio
  22. if ($IP) {                                              # Hay IP, hay que agregar o modificar la entrada
  23.     if ($hosts !~ s/^.+(\t$nuestrohost)/$IP$1/m) {      # Si no conseguimos encontrarla y cambiarla,
  24.         $hosts .= "\n$IP\t$nuestrohost\n\n";            # lo agregamos al final
  25.     }
  26. }
  27. else {                                                  # No hay IP,
  28.     $hosts =~ s/\s^.+$nuestrohost\s+//m;                # hay que quitar la entrada
  29. }
  30.  
  31. ## Grabamos el resultado
  32. write_file($archivohost, $hosts);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Bueno, el funcionamiento es sencillo: leemos el archivo hosts y preguntamos al usuario por la nueva $IP que acompañará al nombre de nuestra máquina. Si el usuario ha introducido algún valor (línea 22) entonces intentaremos primero (línea 23) buscar dentro de $hosts alguna entrada anterior que coincida con ese nombre, y si es el caso, cambiar la $IP. Si no lo encuentra, es el caso de que hosts no contenía nuestra máquina, así que, simplemente, la agrega al final (línea 24). En caso de que el usuario no haya introducido ninguna IP, entonces lo que hacemos es buscar la línea donde está nuestra máquina, y quitarla (línea 28). Finalmente, grabamos el nuevo archivo hosts modificado.

Queda más corto si adoptamos otra estrategia: primero quitamos la entrada, siempre. Y luego la agregamos en caso de que el usuario haya introducido una $IP.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $hosts =~ s/\s^.+$nuestrohost\s+//m;                    # Siempre quitamos la entrada anterior
  2.  
  3. if ($IP) {                                              # Hay IP,
  4.     $hosts .= "\n$IP\t$nuestrohost\n\n";                # lo agregamos al final
  5. }
  6.  
  7. ## Grabamos el resultado
  8. write_file($archivohost, $hosts);
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Un bonito ejemplo de lo que se puede hacer con las expresiones regulares :)
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 44 invitados

cron