use strict;
use vars qw($VERSION);
-$VERSION = '1.02';
+$VERSION = '1.03';
my %err = (
# pressure
} elsif (my ($u, $p, $punit) = $t =~ /^([QA])(?:NH)?(\d\d\d\d)(INS?)?$/) {
-
+
+ $p = 0 + $p;
if ($u eq 'A' || $punit && $punit =~ /^I/) {
$p = sprintf "%.2f", $p / 100;
$u = 'in';
sub AUTOLOAD
{
no strict;
- my $name = $AUTOLOAD;
- return if $name =~ /::DESTROY$/;
- $name =~ s/^.*:://o;
+ my ($package, $name) = $AUTOLOAD =~ /^(.*)::(\w+)$/;
+ return if $name eq 'DESTROY';
- *$AUTOLOAD = sub { $_[0]->{$name}};
+ *$AUTOLOAD = sub {return $_[0]->{$name}};
goto &$AUTOLOAD;
}
return join ' ', ucfirst $n, map {defined $_ ? $_ : ()} @$self;
}
+sub day
+{
+ my $pkg = shift;
+ my $d = sprintf "%d", ref($pkg) ? shift : $pkg;
+ if ($d =~ /1$/) {
+ return "${d}st";
+ } elsif ($d =~ /2$/) {
+ return "${d}nd";
+ } elsif ($d =~ /3$/) {
+ return "${d}rd";
+ }
+ return "${d}th";
+}
+
+
package Geo::TAF::EN::HEAD;
use vars qw(@ISA);
@ISA = qw(Geo::TAF::EN);
sub as_string
{
my $self = shift;
- return "$self->[0] for $self->[1] issued day $self->[2] at $self->[3]";
+ return "$self->[0] for $self->[1] issued at $self->[3] on " . $self->day($self->[2]);
}
package Geo::TAF::EN::VALID;
sub as_string
{
my $self = shift;
- return "valid day $self->[0] from $self->[1] till $self->[2]";
+ return "valid from $self->[1] to $self->[2] on " . $self->day($self->[0]);
}
VV => 'vertical visibility',
SKC => "no cloud",
CLR => "no cloud no significant weather",
- SCT => "5-7 oktas",
- BKN => "3-4 oktas",
+ SCT => "3-4 oktas",
+ BKN => "5-7 oktas",
FEW => "0-2 oktas",
OVC => "8 oktas overcast",
CAVOK => "no cloud below 5000ft >10Km visibility no significant weather (CAVOK)",
- CB => 'thunderstorms',
+ CB => 'thunder clouds',
TCU => 'towering cumulus',
NSC => 'no significant cloud',
BLU => '3 oktas at 2500ft 8Km visibility',
my $self = shift;
my $out = "probability $self->[0]%";
- $out .= " $self->[1] till $self->[2]" if defined $self->[1];
+ $out .= " $self->[1] to $self->[2]" if defined $self->[1];
return $out;
}
{
my $self = shift;
my $out = "temporarily";
- $out .= " $self->[0] till $self->[1]" if defined $self->[0];
+ $out .= " $self->[0] to $self->[1]" if defined $self->[0];
return $out;
}
{
my $self = shift;
my $out = "becoming";
- $out .= " $self->[0] till $self->[1]" if defined $self->[0];
+ $out .= " $self->[0] to $self->[1]" if defined $self->[0];
return $out;
}
themselves.
It is possible to sub-class the translation routines to enable
-translation to other langauages.
+translation to other langauages.
=head1 METHODS
If you sub-class the built-in English translation routines then
you can pick this up by called the constructor thus:-
- C<my $t = Geo::TAF-E<gt>new(chunk_package =E<gt> 'Geo::TAF::ES');>
+ my $t = Geo::TAF->new(chunk_package => 'Geo::TAF::ES');
or whatever takes your fancy.
Returns a list of (as default) C<Geo::TAF::EN> objects. You
can use C<$c-E<gt>as_string> or C<$c-E<gt>as_chunk> to
-translate the internal form into something readable.
+translate the internal form into something readable. There
+is also a routine (C<$c-E<gt>day>)to turn a day number into
+things like "1st", "2nd" and "24th".
If you replace the English versions of these objects then you
will need at an L<as_string()> method.
For a example of a weather forecast from the Norwich Weather
Centre (EGSH) see L<http://www.tobit.co.uk>
-For data see <ftp://weather.noaa.gov/data/observations/metar/>
+For data see L<ftp://weather.noaa.gov/data/observations/metar/>
L<ftp://weather.noaa.gov/data/forecasts/taf/> and also
L<ftp://weather.noaa.gov/data/forecasts/shorttaf/>
# change 'tests => 1' to 'tests => last_test_to_print';
use Test;
-BEGIN { plan tests => 1 };
+BEGIN { plan tests => 16 };
+
use Geo::TAF;
ok(1); # If we made it this far, we're ok.
+
#########################
# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.
+
+my $m;
+
+ok ($m = new Geo::TAF);
+ok (! $m->metar("EGSH 311420Z 29010KT 1600 SHSN SCT004 BKN006 01/M02 Q1021"));
+ok (length $m->as_string > 30);
+ok ($m->icao eq 'EGSH');
+ok ($m->day == 31);
+ok ($m->pressure == 1021);
+ok ($m->temp == 1);
+ok ($m->dewpoint == -2);
+ok ($m->wind_dir == 290);
+ok ($m->wind_speed == 10);
+ok ($m->viz_dist == 1600);
+ok ($m = new Geo::TAF);
+ok (! $m->taf("EGSH 311205Z 311322 04010KT 9999 SCT020
+ TEMPO 1319 3000 SHSN BKN008 PROB30
+ TEMPO 1318 0700 +SHSN VV///
+ BECMG 1619 22005KT"));
+ok ($m->chunks);
+ok ($m->as_chunk_string);