Let's start with a simple case, n = 1 and the charcter a. We want to match from the beginning of the string as many non-a characters as possible, and we know that we must only stop if we encounter an a :
$foo =~ /^([^a]*)a/;
Now let's look at an example of how we could do this for everything the second a. We can't use .* because we would then lose count. We can use .*?, but it won't help much. We will try to match as many non-a characters as possible before the first a, the first a and then again as many non-a characters, and then there must be the second a :
$foo =~ /^([^a]*a[^a]*)a/;
For three as, the RE will look like this :
$foo =~ /^([^a]*a[^a]*a[^a]*)a/;
and if we now look closely, we see a pattern [^a]*a which we can reuse with the Perl RE engine, as we must repeat that pattern n-1 times :
$m = $n -1;
$foo =~ /^(([^a]*a){$m}[^a]*)a/;
Of course, as this pattern has to be recompiled every time we use it, we could as well use the above, unlooped pattern to match.
Update: 20020409 : Fixed small but important typo in the last line of code.$foo =~ /^(([^a]*a){m}[^a]*)a/; obviously won't match $m times...
perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The
$d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider
($c = $d->accept())->get_request(); $c->send_response( new #in the
HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
|