• Publicidad

Reemplazar un número

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

Reemplazar un número

Notapor lis » 2008-11-26 16:57 @748

Hola amigos del foro, tengo un script con el que quiero reemplazar dos valores que se repiten por ceros, pero hay un valor que no me lo reemplaza, y en eso quiero que me ayuden, acá esta un archivo:

Código: Seleccionar todo
1000 -9.989999710577421e+33 -9999 -9999 -9999 -9999
 950 -9.989999710577421e+33 -9999 -9999 -9999 -9999
 925 -9.989999710577421e+33 -9999 -9999 -9999 -9999
 900 -9.989999710577421e+33 -9999 -9999 -9999 -9999
 850 -9.989999710577421e+33 -9999 -9999 -9999 -9999
 800 -9.989999710577421e+33 -9999 -9999 -9999 -9999
 750 14.22650146484375 2576.16552734375 41.81466293334961 -0.181854173541069 1.292466521263123
 700 11.486572265625 3154.31201171875 35.85746002197266 -0.02246991172432899 0.3835094571113586


Donde quiero reemplazar -9.989999710577421e+33 y -9999 por ceros, y me reemplaza los -9999 pero no los -9.989999710577421e+33. Acá está mi script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$data="/home/lissette/MM5toGrADS/D1/20050101_D1/mm5_d1_20050101";

open (DATA,"<$data");
open (ARCHIVOS,">20050101.dat");

while($lineas=<DATA>) {
    chop($lineas);
    @datos=split(" ",$lineas);
    $datos[1] =~ s/-9.989999710577421e+33|-9999/0/g;
    $datos[2] =~ s/-9.989999710577421e+33|-9999/0/g;
    $datos[3] =~ s/-9.989999710577421e+33|-9999/0/g;
    $datos[4] =~ s/-9.989999710577421e+33|-9999/0/g;
    $datos[5] =~ s/-9.989999710577421e+33|-9999/0/g;
    print ARCHIVOS "@datos\n";
}
close (ARCHIVOS);
close (DATA);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Muchas gracias a todos.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Notapor explorer » 2008-11-26 17:39 @777

El problema está en que no has escapado los caracteres especiales del primer número. La expresión correcta es

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
s/-9\.989999710577421e\+33|-9999/0/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No había mucho problema con el '.', pero sí con el '+', que indica que esperamos que el carácter anterior se repita una o más veces. Repasa el significado de "Expresión regular".

Lo que le estabas diciendo es que buscara un patrón de una o más letras 'e', pero no decías nada de encontrar un carácter '+', por lo que no localizaba esos números.

A propósito, no necesitas hacer tanto para tan poco:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$data="/home/lissette/MM5toGrADS/D1/20050101_D1/mm5_d1_20050101";

open (DATA,    "<$data"       );
open (ARCHIVOS,">20050101.dat");

while ($lineas = <DATA>) {
    $lineas =~ s/-9\.989999710577421e\+33|-9999/0/g;
    print ARCHIVOS $lineas;
}
close (ARCHIVOS);
close (DATA);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* No es necesario hacer un chop() para quitar el carácter fin de línea, si luego se lo vas a poner
* No es necesario dividir la línea en columnas, porque con la ayuda de '/g' en la expresión regular, estamos aplicando el operador de sustitución a toda la línea

Es más, si usamos la variable por defecto, el bucle while() se puede reducir más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<DATA>) {
    s/-9\.989999710577421e\+33|-9999/0/g;
    print ARCHIVOS;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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 31 invitados

cron