Среди «погодных» модулей на спане есть и модули для работы с форматами, которые используются в авиации. В частности, несколько модулей для разбора форматов METAR (однозначной расшифровки аббревиатуры не существует) и TAF (Terminal Aerodrome Format).
Данные в формате METAR по аэропортам можно получить, например, на сайте National Weather Service. (О кодах аэропортов уже говорилось). Строка с закодированной информацией о текущей погоде в Шереметьеве (UUED) выглядит так:
UUEE 111930Z 08005MPS 9999 -SN BKN011 M07/M09 Q1029 NOSIG RMK 57410151 07410151
Пользоваться модулем весьма просто:
use v5.10;
use strict;
use Geo::METAR;
my $metar = new Geo::METAR;
$metar->metar($ARGV[0]);
say $metar->dump;
Вызов dump печатает всю имеющуюся информацию, в то время как доступ к отдельным параметром осуществляется через индивидуальные имена, например:
say $metar->TEMP_C; # температура в градусах Цельсия
say $metar->DEW_C; # точка росы
Эти строки напечатают «голые» значения, например: -07 и -09.
Несмотря на название, модуль Geo::TAF способен разбирать и формат METAR:
use v5.10;
use strict;
use Geo::TAF;
my $taf = new Geo::TAF;
$taf->metar($ARGV[0]);
say $taf->as_string;
С упомянутой выше строкой (если ее предварить словом METAR, то вместо вызова одноименного метода можно пользоваться универсальным методом decode, который сам определяет формат — METAR или TAF) эта программа напечатает следующее:
METAR for UUEE issued at 19:30 on 11st wind 080 degrees at 5m/sec visibility >10000m light snow 5-7 oktas cloud at 1100ft temperature -7C dewpoint -9C QNH 1029hPa no significant weather
(No significant weather, ха-ха.)
Точно также возможно обращаться и к отдельным параметрам, например:
say $taf->temp; # напечатало -7
say $taf->dewpoint; # -9
Этот древний модуль 1998 года вполне работоспособен и понимает разные форматы:
use v5.10;
use strict;
use Aviation::Report;
say decode_METAR_TAF($ARGV[0]);
Однако, вывод врядли будет удобым для автоматической обработки. Интересующая меня строка с температурой и точкой росы (это температура, до которой нужно охладить воздух с содержащейся в нем сейчас влагой, чтобы она начала конденсироваться) выглядит так:
temperature -7 Celsius, dew point -9 Celsius.
Это еще один модуль, который напрямую обращается за данными на сайт National Weather Service. (Помимо веб-интерфейса с GET-запросом на этом сайте можно найти отдельные файлы с погодой за каждый час суток.) Но у меня с двух попыток метод Geo::WeatherNWS не завелся.
Комментировать