use strict;
use warnings;
use List::Util qw/first/;
my (@list);
push @list, {type=>'A',time=>1000};
push @list, {type=>'A',time=>1002};
push @list, {type=>'B',time=>1004};
push @list, {type=>'B',time=>1006};
push @list, {type=>'A',time=>1008};
push @list, {type=>'B',time=>1009};
my $ea = first { $_->{type} eq 'A' } @list;
my $eb = first { $_->{type} eq 'B' && $_->{time} >= $ea->{time} } @list;
printf "A %d B %d Diff %d\n", $ea->{time},$eb->{time},$eb->{time}-$ea->{time};
####
my ($i,$j);
while (1) {
$i = -1; $j = -1;
my $ea = first { $i++; $_->{type} eq 'A' } @list;
last unless $ea;
my $eb = first { $j++; $_->{type} eq 'B' && $_->{time} >= $ea->{time} } @list;
last unless $eb;
printf "A %d B %d Diff %d\n", $ea->{time},$eb->{time},$eb->{time}-$ea->{time};
splice @list,$j,1;
splice @list,$i,1;
}
####
A 1000 B 1004 Diff 4
A 1002 B 1006 Diff 4
A 1008 B 1009 Diff 1