#!/usr/bin/perl -w use strict; # The original data structure my %interval = qw( 5 50 20 30 70 90 120 130 ); # The times my @times = qw(4 9 30 98 125 500); # Current intervals open - start with none my %open_intervals; # Let us rearrange the interval information # into events consisting of a time/action my @events; foreach my $start (keys %interval) { my $end = $interval{$start}; my $int = "[$start - $end]"; if ($end < $start) { die "In interval '$int', the end is before the start?"; } push @events, [$start, 0, sub {$open_intervals{$int}++}], [$end, 2, sub {delete $open_intervals{$int}}]; } push @events, map { my $time = $_; [ $_, 1, sub { my @ints = keys %open_intervals; print "Time $time is in intervals (@ints)\n" } ] } @times; # Sort it and read out the answer: foreach my $event ( sort { $a->[0] <=> $b->[0] or $a->[1] <=> $b->[1] } @events ) { $event->[2]->(); }
In reply to Re (tilly) 3 (duh): Assemble times into ranges
by tilly
in thread Assemble times into ranges
by Dominus
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |