use warnings; use strict; my @toks; while(<>){ if(/(\S+)\s+ASH\s+CLOUD/oi){ push @toks, [ 'ASH CLOUD', $1 ]; } map { if(/([NSEW]\d+)/){ push @toks, [ 'COORD', $1 ]; } } split(/\s+/, $_); } my $print_coords = 0; my (@lat,@lon) = ((),()); map { if($_->[0] eq 'ASH CLOUD'){ if($_->[1] eq 'OBS'){ $print_coords = 1; } else { $print_coords = 0; } } if($_->[0] eq 'COORD' and $print_coords) { my $bar = substr($_->[1],0,1); my $foo = substr($_->[1],1,5); $foo = $bar =~ /s|w/i ? flip_sw($foo) : make_dec($foo); push(@lat,$foo) if $bar =~ /e|w/i; push(@lon,$foo) if $bar =~ /s|n/i; } } @toks; while(@lat or @lon) { print shift @lon, " - ", shift @lat, "\n"; } sub lol_debug { foreach my $lol (@toks) { foreach my $rofl (@$lol) { print "$rofl "; } print "\n"; } } exit 0; sub flip_sw { my $val = shift; $val = make_dec(-$val); return $val; } sub make_dec { my $val = shift; $val *= 0.01; return $val; }