#!/usr/bin/perl 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 at $time!\n"); next; } $start_time{$name} = $time; } elsif ($state eq 'switching') { if (!$start_time{$name}) { warn("$name changing state at $time!\n"); next; } } else { if (!$start_time{$name}) { warn("$name not yet on at $time\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 10099,switchZ,switching 10100,switchZ,on 10101,switchZ,off 10089,switchY,on 10093,switchY,switching 10094,switchY,off #### switchD not yet on at 10020 switchF already on at 10021! switchZ changing state at 10099! switchE never turned off! switchF never turned off! switchA was on for 13 seconds switchB was on for 12 seconds switchC was on for 10 seconds switchY was on for 5 seconds switchZ was on for 1 seconds