He conseguido buscar una cadena de texto, $agentN, en el cuarto campo de archivo.txt y, si existe, reemplazar todo el campo por una nueva cadena, $agentC:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict; # estilo estricto
- use warnings; # activar advertencias
- use diagnostics; # diagnósticos de fallos
- use autodie; # «Es mejor morir que regresar con deshonor» --proverbio Klingon
- ### Variables
- my %redes; # almacén con los cambios
- ### Lectura del archivo CSV
- open my $CSV, '<', 'archivo.csv';
- while (<$CSV>) { # para cada línea, hasta fin de archivo
- chomp; # quitamos caracteres fin de línea
- my($nombre, $red) = split /[;]/; # partimos la línea, extraemos columnas
- $redes{$red} = $nombre;
- }
- close $CSV;
- ### Procesado
- open my $ARCHIVO, '<', 'archivo.txt'; # Lectura del archivo a tratar
- open my $SALIDA, '>', 'archivo.new.txt'; # Escritura del archivo resultado
- my $agentN = 'Juan';
- my $agentC = '22333444X';
- while (my $linea = <$ARCHIVO>) { # para cada línea del $ARCHIVO
- my(@campos) = split " ", $linea, 4; # partir en cuatro cachos
- my $IP = $campos[2];
- if (exists $redes{$IP}) { # si tenemos que cambiarla
- $campos[2] = $redes{$IP}; # la cambiamos
- }
- if ($campos[3] =~ $agentN) { # si existe $agentN
- splice(@campos, 3,1,"\"$agentC\"\n"); # lo cambiamos por $agentC
- }
- print $SALIDA join " ", @campos; # guardamos el resultado
- }
- close $ARCHIVO;
- close $SALIDA;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
Tengo un par de dudas.
¿Hay alguna forma de no procesar las 6 primeras líneas de archivo.txt, ya que son una cabecera?
Tengo 4/5 valores para $agentN, cada uno con su correspondiente $agentC. En lugar de 4/5 condiciones, había pensado en definir un hash y utilizar un bucle foreach... ¿qué os parece?
Gracias por la ayuda,