• Publicidad

Filtrar archivos METAR

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

Filtrar archivos METAR

Notapor enric73 » 2013-08-12 16:18 @721

Hola, compañeros, tengo una duda.

El siguiente código me abre un fichero y elimina las palabras que no deseo, por ejemplo NOSIG, AUTO o 9999.

Esto lo hace correctamente, son cadenas fijas.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. my $replacestring = "AUTO";
  3. my $replacestring2 = "9999";
  4. my $replacestring3 = "NOSIG";
  5. #my $replacestring4 = "*V*";
  6.  
  7. open(my $infile,"<","metars.csv") or die $!;
  8. open (my $outfile,">","outmetars.csv") or die $!;
  9. while (<$infile>)
  10. {
  11.     $_=~s/$replacestring//g;
  12.     $_=~s/$replacestring2//g;
  13.     $_=~s/$replacestring3//g;
  14. #    $_=~s/$replacestring4//g;
  15.     print $outfile $_;
  16. }
  17. close $infile;
  18. close $outfile;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Una vez quedan eliminadas estas palabras, tengo un contenido del fichero como el siguiente...

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. LEBL 112000Z 23009KT  FEW025 26/20 Q1017
  2. LEMD 112000Z 15004KT 100V200 CAVOK 33/05 Q1015
  3. LEGE 112000Z 00000KT  FEW040 24/16 Q1017
  4. LEPA 112000Z VRB02KT CAVOK 27/19 Q1017
  5. LFBD 112000Z  01006KT  NSC 22/16 Q1018
  6. LFBH 112000Z  30008KT  NSC 21/16 Q1018
  7. LFBL 112000Z  /////KT  NSC 22/13 Q1020
  8. LFBO 112000Z  VRB02KT  NSC 26/15 Q1018
  9. LFBZ 112000Z  30005KT 260V320  NSC 22/19 Q1018
  10. LFKJ 112000Z 04004KT CAVOK 24/19 Q1015
  11. LFLL 112000Z 03005KT CAVOK 21/12 Q1019
  12. LFLS 112000Z  13005KT  NSC 16/13 Q1020
  13. LFLS 112000Z  13005KT  NSC 16/13 Q1020
  14. LFMD 112000Z  36002KT  NSC 24/19 Q1014
  15. LFMH 112000Z  00000KT  NSC 19/14 Q1020
  16. LFMK 112000Z  VRB03KT  NSC 23/16 Q1017
  17. LFML 112000Z 33014KT CAVOK 27/12 Q1015
  18. LFMN 112000Z 22002KT CAVOK 25/22 Q1015
  19. LFMO 112000Z  35013KT  NSC 24/11 Q1016
  20. LFMP 112000Z  31007KT  NSC 27/12 Q1016
  21. LFMU 112000Z  31009KT  NSC 28/14 Q1016
  22. LFOH 112000Z  00000KT  FEW005 16/14 Q1019
  23. LFOP 112000Z  29004KT  SCT047 BKN058 OVC088 18/14 Q1019
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Aquí viene mi duda:

En las líneas número 2 y 9, necesito que el tercer y cuarto elementos estén unidos por otro símbolo, como '-', '/', o cualquier otro, pero que no haya un blanco.

El caso es que en función del fichero, esto ocurre en otras líneas, los números varían, pero siempre tengo fijo el KT y la V.

¿Qué he de introducir en el código Perl superior para que quedara 15004KT-100V200 y 30005KT-100V200 en las líneas inferiores que están dentro del fichero metars.csv?

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
LEMD 112000Z 15004KT 100V200 CAVOK 33/05 Q1015
LFBZ 112000Z  30005KT 260V320  NSC 22/19 Q1018
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Muchas gracias y saludos
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Publicidad

Re: Filtrar archivos METAR

Notapor explorer » 2013-08-12 19:28 @853

Se puede resolver con una expresión regular, que localice esas palabras, y ponga el '-' en medio. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  3.  
  4. my @replacestrings = qw(
  5.     AUTO
  6.     9999
  7.     NOSIG
  8. );
  9.  
  10. open my $infile,  '<', 'metars.csv';
  11. open my $outfile, '>', 'outmetars.csv';
  12.  
  13. while (<$infile>) {
  14.     for my $replacestring (@replacestrings) {           # quitamos las palabras peligrosas
  15.         s/$replacestring//g;
  16.     }
  17.  
  18.     s/\b\w+?KT\K\s+(?=\d+V\w+)/-/;                      # le ponemos un '-' entre los campos KT y V
  19.  
  20.     print $outfile $_;
  21. }
  22.  
  23. close $infile;
  24. close $outfile;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La expresión regular quiere decir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     s/                  # sustituimos
  2.         \b              # algo que comienza en frontera de palabra
  3.         \w+?            # seguida por una palabra, hasta justo antes de
  4.         KT              # 'KT'.
  5.         \K              # Si ese es el caso, olvidamos lo que hemos visto hasta ahora.
  6.         \s+             # Aquí está el espacio en blanco que vamos a sustituir
  7.         (?=             # siempre y cuando esté seguido
  8.             \d+         # de un conjunto de dígitos,
  9.             V           # seguidos de una 'V',
  10.             \w+         # y una palabra
  11.         )
  12.     /-/x;               # si todo el patrón coincide, lo cambiamos por un '-'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(La '/x' permite escribir la exp. reg. de esa manera :) ) Resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. $ diff metars.csv outmetars.csv 
  2. 2c2 
  3. < LEMD 112000Z 15004KT 100V200 CAVOK 33/05 Q1015  
  4. --- 
  5. > LEMD 112000Z 15004KT-100V200 CAVOK 33/05 Q1015  
  6. 9c9 
  7. < LFBZ 112000Z 30005KT 260V320 NSC 22/19 Q1018 
  8. --- 
  9. > LFBZ 112000Z 30005KT-260V320 NSC 22/19 Q1018 
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Filtrar archivos METAR

Notapor enric73 » 2013-08-13 11:00 @500

Hola, explorer, muchas gracias, ha funcionado, y también gracias con las otras modificaciones realizadas.

¡Veo que aprecias el autodie!

En cuanto a esta línea que sustituye un espacio en blanco por un guion, es digna de ser inscrita en la mismísima pirámide de Keops, ¡un jeroglifico! :D

s/\b\w+?KT\K\s+(?=\d+V\w+)/-/x; # le ponemos un '-' entre los campos KT y V

¿Dónde puedo encontrar información de este tipo de ordenes en formato letras?

Siguiendo el mismo tipo de consulta y que también me sirva de ejemplo para aprender, si quisiera eliminar otra vez un espacio en blanco y sustituirlo en cadenas como la siguiente: SCT047 BKN058 OVC088, de 3 elementos, teniendo en cuenta que el primer termino (SCT, está en la cuarta posición de la fila), ¿cómo puedo hacerlo? En este caso, las elementos a juntar en guion no empiezan por número sino por una letra y el primero está en la posición 4. Ejemplos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
LFRK 112000Z  01003KT-340V040  FEW024 BKN030 BKN036 18/15 Q1019
LFOP 112000Z  29004KT  SCT047 BKN058 OVC088 18/14 Q1019
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Las otras filas de mi fichero no las quiero modificar, y cada una contiene 6 elementos. Y las dos de ejemplo de arriba contienen 8, y quiero pasarlas a 6...
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
LFPB 112000Z  27002KT  NSC 20/12 Q1018
LFPG 112000Z 28004KT CAVOK 20/12 Q1019
LFPO 112000Z 22002KT CAVOK 18/12 Q1019
LFQQ 112000Z 26006KT CAVOK 17/13 Q1018
LFRB 112000Z 33004KT CAVOK 15/11 Q1021
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En resumen, al final necesito tener un data.frame con filas con el mismo número de elementos (número de columnas).

Muchas gracias por la clase de letras mágicas :D

Saludos.
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Filtrar archivos METAR

Notapor explorer » 2013-08-13 12:23 @558

enric73 escribiste:¿Dónde puedo encontrar información de este tipo de ordenes en formato letras?
http://perlenespanol.com/foro/post35328.html#p35328

enric73 escribiste:Siguiendo el mismo tipo de consulta y que también me sirva de ejemplo para aprender, si quisiera eliminar otra vez un espacio en blanco y sustituirlo en cadenas como la siguiente: SCT047 BKN058 OVC088, de 3 elementos, teniendo en cuenta que el primer termino (SCT, está en la cuarta posición de la fila), ¿cómo puedo hacerlo? En este caso, las elementos a juntar en guion no empiezan por número sino por una letra y el primero está en la posición 4.
Si estás seguro que en el resto de campos no aparece 'SCT', se podría hacer una expresión regular que buscara esa combinación, y pusiera los guiones. Algo así (no probado):

s/\b(SCT\w+)\s+(\w+)\s+(\w+)/$1-$2-$3/;

enric73 escribiste:En resumen, al final necesito tener un data.frame con filas con el mismo número de elementos (número de columnas).
Salvo que las transformaciones fueran tan sencillas como las indicadas, yo pensaría en usar un split(), por cada línea, para trabajar por campos. Así, luego, puedo reconstruir el archivo de salida, sabiendo exactamente el número de columnas, y podría decidir qué delimitador usar, o si quiero colocar las columnas en una determinada posición fija (más fácil de leer, después).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Filtrar archivos METAR

Notapor enric73 » 2013-08-13 16:22 @723

Hola, explorer.

Muchas gracias por la ayuda y referencia. Ha funcionado. Me he dado cuenta por eso, que pueden aparecer otras palabras: SCT, y también FEW, BKN, y OVC, en cadenas de 2 o 3 palabras (por ejemplo: SCT18 SCT100 BKN200 o, BKN20 OVC150 FEW 250).

Para evitar líneas como las siguientes, ya que implica muchas combinaciones, 4 elevado a 3 o 4 elevado a 2...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. s/\b(BKN\w+)\s+(BKN\w+)\s+(BKN\w+)/$1-$2-$3/;
  2. s/\b(SCT\w+)\s+(BKN\w+)/$1-$2/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Podría (no me funciona) solventar el problema de la siguiente manera?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @replacestrings2 = qw(
  2.         FEW
  3.         SCT                                     #meto todas las palabras que pueden aparecer
  4.         BKN
  5.         OVC
  6.        
  7.     );
  8. for my $replacestring2 (@replacestrings2) {          
  9. s/\b($replacestring2\w+)\s+($replacestring2\w+)\s+($replacestring2\w+)/$1-$2-$3/;
  10. s/\b($replacestring2\w+)\s+($replacestring2\w+)/$1-$2/;    
  11.   }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Filtrar archivos METAR

Notapor explorer » 2013-08-13 19:27 @852

No, eso no funcionará.

Debes encontrar una o unas pocas reglas que engloben a todo el universo de combinaciones. O a lo máximo posible.

Por ejemplo... ¿este archivo es de un formato conocido?

El archivo de entrada se llama metars.csv, y de ahí deducimos que el formato interno del archivo es un CSV, aunque en los ejemplos no aparecen comas, sino espacios en blanco.

Realmente, este archivo es una colección de registros METAR, así que debería ser fácil hacer un programa que lo interpretara.

Ejemplos:
  • 30008KT: dirección del viento a 300°, con una velocidad media de 8 nudos
  • 260V320: el viento está variando de 260° a 320°
  • CAVOK: son las siglas de Ceiling And Visibility OKay, es decir: no hay nubes por debajo de los 1500 m, y una visibilidad de 10 km, sin condiciones climatológicas destacables
  • SCT047: hay nubes dispersas, ocupando los 3/8 del cielo, sin nubes bajas, altocúmulos a media altura, y cirroestratos en altura
  • 18/14: temperatura de 18° y punto de rocío de 14°
  • Q1019: presión barométrica de 1019 hPa
Entonces... es fácil interpretar los contenidos, si conoces cómo son los códigos.

Lo que no entiendo es por qué quieres entonces unir algunos campos con guiones. Si lo haces, dejan de ser registros METAR.

En CPAN veo a solo un paquete relacionado con esto: Geo::METAR, que hace justo la interpretación de estos registros.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Filtrar archivos METAR

Notapor enric73 » 2013-08-14 06:50 @327

Hola, explorer, gracias por las aclaraciones y referencia.

Sí, tienes razón, en realidad, tal como está, es un formato .dat, le faltarían las comas. Conozco de hace tiempo los registros METAR, unos cuantos años, porque soy meteorólogo. :D

Bien, el motivo para juntar los BKN-SCT... con guiones, es porque luego trabajo con el lenguaje R y es más cómodo tener data.frame (para mi) con filas con el mismo número de columnas. En todo caso, he probado el módulo que me has referenciado, Geo::METAR.

Lo he probado con un metar

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. use Geo::METAR;
  3. use strict;
  4. use warnings;
  5. my $m = new Geo::METAR;
  6. $m->metar("LEBL 112000Z 23009KT 9999 FEW025 26/20 Q1017 NOSIG");
  7. print $m->dump;
  8. exit;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y la salida es

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Modified METAR dump follows.

type: METAR
site: LEBL
date_time: 112000Z
modifier: AUTO
wind: 23009KT
visibility: 9999
runway:
weather:
sky: FEW025
temp_dew: 26/20
alt: 30.031992711
slp:
remarks:

ALT: 30.031992711
DATE: 11
DEW_C: 20
DEW_F: 68.0
HOURLY_DEW_C:
HOURLY_DEW_F:
HOURLY_PRECIP:
HOURLY_TEMP_C:
HOURLY_TEMP_F:
METAR: LEBL 112000Z 23009KT 9999 FEW025 26/20 Q1017 NOSIG
MOD: AUTO
REMARKS:
RUNWAY:
SITE: LEBL
SKY: Few at 2500ft
SLP:
TEMP_C: 26
TEMP_F: 78.8
TIME: 20:00 UTC
TYPE: Routine Weather Report
VERSION: 1.15
VISIBILITY: 9999 meters
WEATHER:
WEATHER_LOG:
WIND_DIR_ABB: SW
WIND_DIR_DEG: 230
WIND_DIR_ENG: Southwest
WIND_GUST_KTS:
WIND_GUST_MPH:
WIND_KTS: 09
WIND_MPH: 10.3572
WIND_VAR:
WIND_VAR_1:
WIND_VAR_2:
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Pero no entiendo cómo interpretar más de un metar a la vez... por ejemplo, ¿si tengo un fichero con 10 metars...?

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
LEBL 140600Z 32007KT 290V350 9999 FEW020 23/18 Q1017 NOSIG
LEMD 140600Z 35003KT CAVOK 21/13 Q1019 NOSIG
LEGE 140600Z 00000KT CAVOK 18/18 Q1018
LEPA 140600Z 07007KT CAVOK 24/19 Q1017 NOSIG
LFBD 140600Z AUTO 36005KT 9999 NSC 15/10 Q1023
LFBH 140600Z AUTO 05007KT 9999 NSC 14/10 Q1024
LFBL 140600Z AUTO 06006KT 9999 NSC 14/08 Q1023
LFBO 140600Z AUTO 30006KT 9999 NSC 16/12 Q1021
LFBZ 140600Z 18003KT 9999 FEW012 16/15 Q1022 NOSIG
LFKJ 140600Z 05007KT 9999 FEW011 21/17 Q1013 NOSIG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Sabes cómo hacerlo? ¿con un array?

Saludos
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Filtrar archivos METAR

Notapor explorer » 2013-08-14 11:30 @521

Se puede hacer de muchas formas, la cuestión es saber cómo quieres el resultado final.

Por ejemplo, con el siguiente código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  4. #use Data::Dumper::Simple;
  5. use Geo::METAR;
  6.  
  7. open my $METAR, '<', 'metars.csv';
  8. chomp(my @metars = <$METAR>);
  9. close $METAR;
  10.  
  11. foreach my $m (@metars) {
  12.     my $metar = Geo::METAR->new();
  13.     $metar->debug(0);
  14.     $metar->metar($m);                  # interpretamos
  15.  
  16. #    say $metar->METAR();               # valor original
  17.  
  18.     my $cielo  = join '-', @{$metar->sky};
  19.     if (!$cielo) {
  20.        $cielo = 'NSC';
  21.     }
  22.     my $viento = $metar->wind() // ${$metar->tokens}[2];    # esto... no es del todo bueno hacerlo así
  23.  
  24.     say
  25.         join " ",
  26.                 $metar->SITE(),
  27.                 $metar->date_time(),
  28.                 $viento,
  29.                 $cielo,
  30.                 $metar->temp_dew(),
  31.                 'Q' . $metar->pressure(),
  32.         ;
  33.  
  34. #    $m = $metar;                        # lo guardamos en el mismo array, para luego hacer el Dumper
  35. }
  36.  
  37. #say Dumper @metars;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
la salida es
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
LEBL 112000Z 23009KT FEW025 26/20 Q1017
LEMD 112000Z 15004KT CAVOK 33/05 Q1015
LEGE 112000Z 00000KT FEW040 24/16 Q1017
LEPA 112000Z VRB02KT CAVOK 27/19 Q1017
LFBD 112000Z 01006KT NSC 22/16 Q1018
LFBH 112000Z 30008KT NSC 21/16 Q1018
LFBL 112000Z /////KT NSC 22/13 Q1020
LFBO 112000Z VRB02KT NSC 26/15 Q1018
LFBZ 112000Z 30005KT NSC 22/19 Q1018
LFKJ 112000Z 04004KT CAVOK 24/19 Q1015
LFLL 112000Z 03005KT CAVOK 21/12 Q1019
LFLS 112000Z 13005KT NSC 16/13 Q1020
LFLS 112000Z 13005KT NSC 16/13 Q1020
LFMD 112000Z 36002KT NSC 24/19 Q1014
LFMH 112000Z 00000KT NSC 19/14 Q1020
LFMK 112000Z VRB03KT NSC 23/16 Q1017
LFML 112000Z 33014KT CAVOK 27/12 Q1015
LFMN 112000Z 22002KT CAVOK 25/22 Q1015
LFMO 112000Z 35013KT NSC 24/11 Q1016
LFMP 112000Z 31007KT NSC 27/12 Q1016
LFMU 112000Z 31009KT NSC 28/14 Q1016
LFOH 112000Z 00000KT FEW005 16/14 Q1019
LFOP 112000Z 29004KT SCT047-BKN058-OVC088 18/14 Q1019
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En el código se usan varias formas para acceder a los campos, como el caso del método tokens(), pero eso no implica que los campos estén siempre en el mismo orden y posición.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Filtrar archivos METAR

Notapor enric73 » 2013-08-14 15:17 @678

Muchas gracias, explorer,

Unas dudas

chomp(my @metars = <$METAR>); ¿cada salto de línea es un nuevo elemento del vector (array) y así cada metar es un elemento del array metars?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach my $m (@metars) {
  2. my $metar = Geo::METAR->new();                      # Aquí el new está al final, ¿es para reiniciar el siguiente registro de metar?  
  3. $metar->debug(0);                                   # ¿Qué se consigue con debug(0)?
  4. $metar->metar($m);                  # ¿cada vez una línea diferente? ¿$m es el número de elementos del vector?
  5. #print $metar->dump;    
  6. say $metar->METAR();               # valor original
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (!$cielo) {
  2. $cielo = 'NSC';  # ¿Si el campo cielo está vacío se le da el valor NSC?
  3.  
  4. my $viento = $metar->wind() // ${$metar->tokens}[2]; # ¿no entiendo el tokens?
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchas gracias, y buenas noches
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Filtrar archivos METAR

Notapor explorer » 2013-08-14 19:39 @860

enric73 escribiste:chomp(my @metars = <$METAR>); ¿cada salto de línea es un nuevo elemento del vector (array) y así cada metar es un elemento del array metars?
Se lee cada línea del archivo y se mete como elementos distintos dentro del array. Más tarde, chomp() se encarga de quitar los finales de línea a todos los elementos.

enric73 escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach my $m (@metars) {
  2. my $metar = Geo::METAR->new();                      # Aquí el new está al final, ¿es para reiniciar el siguiente registro de metar?  
  3. $metar->debug(0);                                   # ¿Qué se consigue con debug(0)?
  4. $metar->metar($m);                  # ¿cada vez una línea diferente? ¿$m es el número de elementos del vector?
  5. #print $metar->dump;    
  6. say $metar->METAR();               # valor original
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La forma moderna de llamar a los métodos de un objeto es de la forma que te he puesto. La otra (new Geo::METAR) no es recomendable usarla. Es solo una cuestión de notación. Lo que hacemos en esa línea es crear un objeto de tipo Geo::METAR.

El debug() lo puse porque mientras estaba haciendo el programa, quería ver si Geo::METAR leía bien todos los registros (no sea que hubiera algún registro o campo que no entendiera). Con la opción debug(1) se activa la opción de depurado, y Gep::METAR va informando de lo que va haciendo (esto lo tienes descrito en la página de manual de Geo::METAR. Cuando comprobé que todo iba bien, pues le puse un '0', y ya quedó así (se puede quitar la línea, no molesta).

$m contiene cada uno (foreach) de los elementos de @metars, es decir, las líneas que habíamos leído del archivo.

enric73 escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (!$cielo) {
  2. $cielo = 'NSC';  # ¿Si el campo cielo está vacío se le da el valor NSC?
  3.  
  4. my $viento = $metar->wind() // ${$metar->tokens}[2]; # ¿no entiendo el tokens?
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sí. NSC = No significant clouds.

tokens() es un método que devuelve los campos leídos del registro METAR. Mejor dicho: devuelve una referencia a un array, cuyos elementos son cada uno de los campos del registro METAR que le pasamos antes con el método metar(). Así, si teníamos un registro

'LEMD 112000Z 15004KT CAVOK 33/05 Q1015'

tokens() nos devolverá esto:

[ 'LEMD', '112000Z', '15004KT', 'CAVOK', '33/05', 'Q1015' ]

Entonces, si a esa referencia, la metemos dentro de un ${}, estamos accediendo a uno de esos elementos. En concreto, al número 2 (indicado por los corchetes).

Otra forma de escribir

${$metar->tokens}[2]

es

$metar->tokens->[2]

aunque quizás queda algo oscuro.

P.D. Hay un montón de información dentro del código del módulo Geo::METAR (archivo METAR.pm)... están descritos los formatos de los distintos campos, por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron