in reply to Finding gaps in date ranges

What about something like...
my $error = 0; my @tmp = sort datesort qw( 2000-4 2000-2 2000-1 2000-12 2001-1 2002-1 +2 1999-12 ); my($year,$month) = split '-', $tmp[0]; for(my $i = 1; $i < @tmp; $i++) { if(++$month == 13) { $month = 1; $year++; } if($tmp[$i] ne "$year-$month") { print "ERROR! gap at '$year-$month', '$tmp[$i]' found!\n"; $error = 1; last; } } print "Success\n" unless $error; sub datesort { my($a1,$a2) = split '-', $a; my($b1,$b2) = split '-', $b; $a1 <=> $b1 or $a2 <=> $b2; }
Tested on the bad and good arrays, you should be able to modify it for your needs easily enough...

it would be shorter if your dates were zero padded.

Update on afterthought I should say what it does... it sorts the date array (could be an array of hash keys), it then starts at the first, or earliest one, it goes through the array adding one to the month and wrapping the year and setting month to 1 if the month hits 13. it goes till it finds a date it didnt expect, or gets to the end of the array sucessfully. Pretty simple, needed the special sort since months were not zero padded.
                - Ant

Replies are listed 'Best First'.
(Ovid) Re(2): Finding gaps in date ranges
by Ovid (Cardinal) on May 11, 2001 at 00:37 UTC

    The output from your program is:

    ERROR! gap at '2000-3', '2000-4' found!

    However, gaps exist at 2000-5 through 2000-11 and 2001-2 through 2002-11, yet were not reported. Did I misunderstand something about your code or how to use it?

    Cheers,
    Ovid

    Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

      my $error = 0; my @gaps; my @tmp = sort datesort qw( 2000-4 2000-12 2001-1 2002-12 1999-12 ); my($year,$month) = split '-', $tmp[0]; for(my $i = 1; $i < @tmp; $i++) { my $gap = 0; my @range; do { $range[1] = "$year-$month"; if(++$month == 13) { $month = 1; $year++; } if($tmp[$i] ne "$year-$month") { $range[0] = "$year-$month" unless $gap; $gap++; $error = 1; } if($gap > 100) { print "ERROR! infinite loop\n"; last; } } until($tmp[$i] eq "$year-$month"); if($gap) { push @range, "$year-$month"; push @gaps, \@range; } } if($error) { for(@gaps) { print "Gap from $_->[0] to $_->[1]\n"; } } print "Success\n" unless $error; sub datesort { my($a1,$a2) = split '-', $a; my($b1,$b2) = split '-', $b; $a1 <=> $b1 or $a2 <=> $b2; }
      This stores the ranges...
                      - Ant
      Yeah, just realized that... easy fix... one second...
                      - Ant