use warnings; use strict; my @pat_array = sort { length $b <=> length $a } qw/ foo ba baz quzz /; my $InStartLineNumber = 2; # nr. of lines to skip my $i=0; my ($regex) = map {qr/$_/} join '|', map { '(?'.quotemeta.')' } @pat_array; # pre-sorted above my @match_count = (0) x @pat_array; for 1..$InStartLineNumber; while () { if ($_=~$regex) { $match_count[ substr( (keys %+)[0], 1 ) ]++; } } for my $i (0..$#pat_array) { print $pat_array[$i],": ",$match_count[$i],"\n"; } __DATA__ Skip me foo Skip me bar Hello foo World bar foo bar baz foo quz