use strict; use warnings; my %start_time; my %total_time; while () { # Or iterate through your array chomp; my ($time, $name, $state) = split /,/; # Or better: Text::CSV if ($state eq 'on') { if ($start_time{$name}) { warn("$name already on!\n"); next; } $start_time{$name} = $time; } else { if (!$start_time{$name}) { warn("$name not yet on!\n"); next; } $total_time{$name} += $time - delete $start_time{$name}; } } for my $name (sort keys %start_time) { warn("$name never turned off!\n"); } for my $name (sort keys %total_time) { print("$name was on for $total_time{$name} seconds\n"); } __DATA__ 10000,switchA,on 10001,switchB,on 10002,switchC,on 10005,switchA,off 10007,switchA,on 10012,switchC,off 10013,switchB,off 10015,switchA,off 10020,switchE,on 10020,switchD,off 10020,switchF,on 10021,switchF,on #### ... my %switches = map { $_ => 1} @switches; while () { chomp; my ($time, $name, $state) = split /,/; next if !$switches{$name}; ... } ...