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:
Using perl Syntax Highlighting
foreach my $m (@metars) {
my $metar = Geo::METAR->new(); # Aquí el new está al final, ¿es para reiniciar el siguiente registro de metar?
$metar->debug(0); # ¿Qué se consigue con debug(0)?
$metar->metar($m); # ¿cada vez una línea diferente? ¿$m es el número de elementos del vector?
#print $metar->dump;
say $metar->METAR(); # valor original
Coloreado en 0.001 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:Using perl Syntax Highlighting
if (!$cielo) {
$cielo = 'NSC'; # ¿Si el campo cielo está vacío se le da el valor NSC?
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.