use warnings; use strict; our %intervals = (); our %counts = (); open F2,") { chomp; my ($pre,$lower,$upper) = split /\s-+/; my $intvs = $intervals{$pre}; my $i = scalar( grep { $_->[0]<=$lower } @$intvs); die "overlap found: $pre $intvs->[$i-1]->[0]..$intvs->[$i-1]->[1] vs. $lower..$upper" if( $i>0 && !$intvs->[$i-1]->[1]<=$lower ); die "overlap found: $pre $lower..$upper vs. $intvs->[$i]->[0]..$intvs->[$i]->[1]" if( $i<@$intvs && !$upper<=$intvs->[$i]->[0] ); splice @{$intervals{$pre}},$i,0,[$lower,$upper]; } close F2; open F1,") { chomp; my ($pre,$n,$r) = split /\s-+/; my ($intv) = grep {$_->[0] <= $n && $n < $_->[1]} $intervals{$pre}; $counts{"$pre $intv->[0]"} += $r; } close F1; for (keys %counts) { print "$_ $counts{$_}\n"; }