use Data::Dumper; use strict; use warnings; my (%counts, $case, $req); while () { chomp; if (m/\Q[Case-Url] - \E(.*)/) { $case = $1; } elsif (m/\Q[Req-URL ] - \E(.*)/) { $req = $1; } if (m/\*\*\*(Passed|Failed)\*\*\*/) { $counts{$1}{'case'}{$case}++; $counts{$1}{'req'}{$req}++; } } print Dumper(\%counts); __DATA__ Execution start time 09/13/2013 02:43:55 pm [Case-Url] - www.google.com [Req-URL ] - www.qtp.com ***Passed*** __________________________________________________________ [Case-Url] - www.yahoo.com [Req-URL ] - www.msn.com ***Passed*** ___________________________________________________________ [Case-Url] - www.google.com [Req-URL ] - www.qtp.com ***Failed***