--- NMEA.pm 2007/12/03 14:57:31 16 +++ lib/NMEA.pm 2007/12/07 03:44:12 27 @@ -16,6 +16,17 @@ } my $got_it; +my $stats; + +sub error { + my ( $self, $message, $line ) = @_; + push @{ $stats->{errors}->{$message} }, $line; +} + +sub stats { + my $self = shift; + return $stats; +} sub line { my $self = shift; @@ -25,12 +36,18 @@ chomp; my @a = split(/,/,$_); - return unless $#a == 12; + if ( $#a != 12 ) { + $self->error( 'invalid line length' => $_ ); + return; + } # warn "## [$#a] ", join(' ', map { "$_:$a[$_]" } ( 0 .. $#a )), " from $_\n"; # is valid? - return unless $a[2] eq 'A'; + if ( $a[2] ne 'A' ) { + $self->error( 'not valid' => $_ ); + return; + } my $hash; my $i = 1; # skip GPRMC; @@ -41,7 +58,15 @@ $hash->{lat} = hhmm( ( $hash->{lat_ns} eq 'S' ? -1 : 1 ) * $hash->{lat_hhmm} ) || return; $hash->{lon} = hhmm( ( $hash->{lon_ew} eq 'W' ? -1 : 1 ) * $hash->{lon_hhmm} ) || return; - return if ( $got_it->{ $hash->{lat} . ' ' . $hash->{lon} }++ ); + if ( $got_it->{ $hash->{lat} . ' ' . $hash->{lon} }++ ) { + $self->error( 'duplicate line' => $_ ); + return; + } + + $stats->{ 'min_'.$_ } = $hash->{ $_ } < $stats->{ 'min_'.$_ } foreach ( qw/lat lon/ ); + $stats->{ 'max_'.$_ } = $hash->{ $_ } > $stats->{ 'max_'.$_ } foreach ( qw/lat lon/ ); + + $hash->{number} = $stats->{total}++; # warn "##>>>> ",dump( $hash ); return $hash;