my %times; my $job; while () { next unless (s{^\[(\d+/\d+/\d+ \d+:\d+:\d+)\]\s*}{}); # malformed line my $timestamp = $1; if (m/^(Synchonization|Analyzing) (started|finished), job: "(.*?)"/) { $job = $3; $times{$job}->{$1}->{$2} = $timestamp; } elsif (m/^Summary:/) { $times{$job}->{summary} = $_; } } print Dumper(\%times); use Data::Dumper;