in reply to multiple matches with regexp

You could do it this way. I'm using a manual position rather than utilizing the default characteristics of /g. I advance the position by one character each time through the loop. And if I get a match, I advance it by one plus the offset of the beginning of that match. It probably could be golfed down a lot (for instance, the use of $sstr is unnecessary; substr can be bound directly to the regexp. And there is probably not really a need for the "else" condition in the loop, but I just wanted to cover all bases and make it as clear as possible. Here it is...
use strict; use warnings; my $string = "aabbaaaabbaaabbbbabaabbbaaaa"; my @a; my $position = 0; while ( $position < length $string ) { my $sstr = substr($string,$position); if ( $sstr =~ /(aa)/ ) { push @a, $1; $position+=$-[0]+1; } else { $position++; } } print join("-", @a), "\n";

Dave


"If I had my life to do over again, I'd be a plumber." -- Albert Einstein

Replies are listed 'Best First'.
Re: Re: multiple matches with regexp
by almaric (Acolyte) on Oct 11, 2003 at 00:51 UTC
    I stripped this for me down to
    $regexp="a{2}"; $_="aaaa"; do { push @a, $1 if ( m/^($regexp)/ ) } while ( s/^.// ) ; print join ( "-", @a );
    The main difference is, that I match the pattern at the beginning of the string while you match it on the substr

    Thanks for the input.