• Publicidad

Actualizar archivos

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

Actualizar archivos

Notapor ricky_jr » 2009-08-21 21:36 @941

Hola, comunidad, tengo un nuevo reto, este es algo largo, se trata de:
  1. extraer datos específicos de un archivo #eso sí lo hace
  2. escribirlos en uno nuevo #eso también lo hace
  3. enviar un parámetro para que lo busque y lo modifique, los datos o línea de datos #no lo hace
  4. y luego actualizarlos en el primer archivo #eso no lo hace

Bueno, de entrada supongamos que tengo mis datos en mi nuevo archivo en forma de lista y la manera de identificarlos es con la primera palabra. Ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
server 21.21.21.21
port 1092
conexion tcp
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Digamos que el usuario le envía un nuevo puerto a port. Se tiene que actualizar con el nuevo valor, digamos que por el momento no es tan importante que lo actualice en el primer archivo, es por eso que hago un split() en la función sustituye y quisiera que cuando encontrara el parámetro enviado por el usuario lo pudiera sustituir. Bueno, espero me puedan ayudar.

GRACIAS

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$file = '/home/cliente/serverconfesp';
open (FILE,">$file") or $msg = "File error";
$new='/home/cliente/nuevo';
open (NEW,">$new") or $msg = "File error";
sub data_get {                 #función
    while(<FILE>) {            #while que recibe los parámetros de FILE
        @linea = split;            #se guarda en @linea el split
        $sharp = "$linea[0]";      #se declara una var que guarda la primera palabra
        if (($sharp!~/\#/) && ($sharp==/^\n/)) #se compara que cuando sea diferente al símbolo # y al salto de línea  
        {
            print NEW "$_";       #lo imprima o lo escriba en este caso en el archivo NEW
        }
    }
}

sub sustituye(a, b) {     #creo una nueva función con dos parámetros  
    my $variable = $_[0];            # y le digo que lo lea en este orden
    my $valor    = $_[1];
    print NEW "$variable $valor ";   #y que lo escriba en el archivo NEW
}

my $resivir = &data_get();  #coloco la función en una variable
while($resivir) {           #hago que la reciba el while y la recorra
    @linea = split;         #que se guarde en @linea el split  
    $firt = "$linea[0]";    #la primera cadena se guarda en $firt
    if ($firt eq "verb")    # comparación de verb con la cadena $firt
    {
        &sustituye("verb","4");    #invoco a la función con los parámetros que quiero que sustituya
    }
}

close (FILE);  
close (NEW);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-08-22 05:40 @278, editado 2 veces en total
Razón: Ortografía y estilo. Formateo de código. Bloques de código
ricky_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-08-12 21:07 @921

Publicidad

Re: ACTUALIZAR ARCHIVOS

Notapor Leo_Gutierrez » 2009-08-21 23:30 @021

Mi código da lastima, pero bueno, sirve de algo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. if($#ARGV != 0)
  5. {
  6.         print "$0 puerto\n";
  7.         exit(1);
  8. }
  9. open(FILE, "<file.txt") or die("No se pudo abrir el archivo.\n");
  10. my @codigo = <FILE>;
  11. close(FILE);
  12. open(FILE, ">file.txt") or die("No se pudo abrir el archivo.\n");
  13. foreach my $linea (@codigo)
  14. {
  15.         if($linea =~ m/port/i)
  16.         {
  17.                 print FILE "port $ARGV[0]\n";
  18.         } else {
  19.                 print FILE "$linea";
  20.         }
  21. }
  22. close(FILE);
  23. exit(0);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. leo@lein:~/Escritorio/pl$ cat "file.txt"
  2. server 21.21.21.21
  3. port 1092
  4. conexion tcp
  5.  
  6. leo@lein:~/Escritorio/pl$ perl pl.pl 5550
  7. leo@lein:~/Escritorio/pl$ cat "file.txt"
  8. server 21.21.21.21
  9. port 5550
  10. conexion tcp
  11.  
  12. leo@lein:~/Escritorio/pl$
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Actualizar archivos

Notapor explorer » 2009-08-22 05:56 @289

ricky_jr escribiste:Hola, comunidad, tengo un nuevo reto, este es algo largo, se trata de:

¿Es un nuevo reto? Parece el mismo problema de antes, pero con nuevas tareas.

Te recomiendo que NO crees nuevos hilos de discusión sobre el mismo asunto. Es mejor que sigas ampliando los hilos anteriores. O los administradores lo podrán borrar por ser duplicados.
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: Actualizar archivos

Notapor ricky_jr » 2009-08-22 10:41 @486

Lo siento, no lo sabia; soy nuevo en el foro y no pensé que eso estuviera prohibido. Pero bueno, aún no resuelvo mi problema. Espero me ayuden...
Última edición por explorer el 2009-08-22 16:40 @736, editado 1 vez en total
Razón: Ortografía
ricky_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-08-12 21:07 @921

Re: Actualizar archivos

Notapor ubuntu » 2009-08-22 10:56 @497

Buenas

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. if ($ARGV[0]) {
  4.     open(archivo,"<archivo.txt");
  5.     my @archivo =<archivo>;
  6.     close(archivo);
  7.     open(archivo,">archivo.txt");
  8.     foreach my $tmp(@archivo) {
  9.         my @datos_busca = split(" ",$tmp);
  10.         if($ARGV[0] eq $datos_busca[0] && $ARGV[1] ne $datos_busca[1]) {
  11.             print archivo "$ARGV[0] $ARGV[1]\n";
  12.         }
  13.         else {
  14.             print archivo "$tmp";
  15.         }
  16.     }
  17.     close(archivo);
  18. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


el archivo archivo.txt contiene :
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
servidor perl.es
puerto 21
protocolo tpc
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


probando el código :

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. ubuntu@ubuntu-desktop:~$ cat archivo.txt
  2. servidor perl.es
  3. puerto 21
  4. protocolo tpc
  5. ubuntu@ubuntu-desktop:~$ perl scrip.pl puerto 80
  6. ubuntu@ubuntu-desktop:~$ cat archivo.txt
  7. servidor perl.es
  8. puerto 80
  9. protocolo tpc
  10. ubuntu@ubuntu-desktop:~$ perl scrip.pl servidor perlenespanol.com
  11. ubuntu@ubuntu-desktop:~$ cat archivo.txt
  12. servidor perlenespanol.com
  13. puerto 80
  14. protocolo tpc
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡Saludos!
Última edición por explorer el 2009-08-22 18:07 @796, editado 1 vez en total
Razón: Indentación y formateo del código
Avatar de Usuario
ubuntu
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-08-19 07:30 @354

Re: Actualizar archivos

Notapor ricky_jr » 2009-08-22 12:58 @582

Como ven mi nuevo código en realidad lo que pretendo hacer es que sobre escriba en la línea por lo que genere el código siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $file='/home/cliente/serverconfesp';
  4. open(FILE,"$file") or $msg = "File error";
  5. $new='/home/cliente/nuevo';
  6. open (NEW,"+< $new") or $msg = "File error";
  7.                
  8. while(<FILE>) {
  9.     @linea=split;          
  10.     $sharp="$linea[0]";            
  11.     if (($sharp!~/\#/) && ($sharp==/^\n/))    
  12.     {
  13.         print NEW "$_";
  14.     }  
  15. }
  16.  
  17. sub sustituye{
  18.    my $arg=$_[0];
  19.    my $arg1=$_[1];
  20.    while(<NEW>){
  21.        @lin=split;          
  22.        my $var="$lin[0]";
  23.        my $val="$lin[1]";
  24.        if ($arg eq $var)
  25.        {
  26.            print NEW "$arg $arg1";
  27.        }
  28.        else {
  29.            print NEW "$var $val";
  30.        }
  31.    }
  32. }
  33.  
  34. &sustituye("port","1111");  
  35.  
  36. close (FILE);  
  37. close (NEW);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


pero aún no hace lo que deseo; espero me puedan ayudar...

A lo que pasa, que los parámetros están directos para probarlos; en realidad ahí irán dos variables que enviará el usuario...
Última edición por explorer el 2009-08-22 16:53 @745, editado 3 veces en total
Razón: Ortografía, indentación del código
ricky_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-08-12 21:07 @921

Re: Actualizar archivos

Notapor Leo_Gutierrez » 2009-08-22 13:09 @589

No necesitas crear la función si al fin de cuentas vas a dar el valor que quieres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. &sustituye("port","1111");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Utiliza los códigos que se te dieron anteriormente.

Y por favor, ponle el coloreado a tú código, para eso está el editor, utiliza la opción "Perl".
Leo_Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 91
Registrado: 2008-08-20 23:38 @026

Re: Actualizar archivos

Notapor explorer » 2009-08-22 16:42 @737

ricky_jr escribiste:Lo siento, no lo sabia; soy nuevo en el foro y no pensé que eso estuviera prohibido. Pero bueno, aún no resuelvo mi problema. Espero me ayuden...

No, si prohibido no está... lo que pasa es que es mejor no inundar los foros de temas cuasi iguales.
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: Actualizar archivos

Notapor explorer » 2009-08-22 17:57 @790

Yo voy a dar mi solución: usar Tie::File:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Tie::File;
  7.  
  8. tie my @fichero, 'Tie::File', 'kk.txt' or die "ERROR: $!\n";
  9.  
  10. sustituye(@ARGV);   # Esperamos dos argumentos: clave y valor
  11.  
  12. untie @fichero;
  13.  
  14.  
  15. sub sustituye {
  16.     my $clave = shift;
  17.     my $valor = shift;
  18.  
  19.     for (@fichero) {
  20.         s/^$clave.*/$clave $valor/;
  21.     }
  22. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ejemplos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> cat kk.txt
server 21.21.21.21
port 1234
conexion tcp
explorer@casa:~/Documents/Desarrollo> ./kk.pl port 12345; cat kk.txt
server 21.21.21.21
port 12345
conexion tcp
explorer@casa:~/Documents/Desarrollo> ./kk.pl conexion udp; cat kk.txt
server 21.21.21.21
port 12345
conexion udp
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Se ve lo cómodo que es usar un fichero externo con este módulo: no tienes que preocuparte de abrir/cerrar ficheros, ni de leer/escribir en ellos.

Además, Tie::File viene incluido de base en todas las distribuciones Perl modernas.

En la expresión regular, s/^$clave.*/$clave $valor/;, buscamos la palabra $clave al principio (^) de la línea, y la sustituimos a ella y a todo lo que le sigue (.*) por ella misma más el nuevo $valor.
Última edición por explorer el 2009-08-22 18:00 @792, editado 1 vez en total
Razón: Explicación de la regex
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 1 invitado

cron