johnnywang has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I have a collection of patterns (actually just keywords). For a given input string, I'd like to find out the number of matches for each of the keywords. A simple solution is as follows:
use strict; my @keywords=qw/foo bar 12345 abcd/; my $string = "foobarfoo1234523423412345abcdefsadfabc"; my %result; foreach my $k (@keywords){ my @matches = ($string =~ /$k/ig ); $result{$k} = scalar(@matches); } foreach my $s (keys %result){ print "$s=>$result{$s}\n"; } __END__ bar=>1 12345=>2 foo=>2 abcd=>1
Now my problem is that the array @keywords can be big (~ 10000), and the string can be pretty long. The above method goes through the string many times (same as @keywords), I'd like to make it more efficient by going through it, say once. One step in that direction is probably concat a long expression:
$pattern = join("|", @keywords);
but how do I get the count? Are there other ways (e.g., construct explicitly some kind of DFA) to do this? Thanks.

20041208 Edit by castaway: Changed title from 'Count mutliple pattern matches'