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};