in reply to Simple regex question

"\1" means the first opened parenthesis. You need to use "\2".

$ perl -e '$_="aaabbccccddeee"; print $1,$/ while /((.)\2*)/g' # ^^ # || # |+--- \2 # | # \1 aaa bb cccc dd eee

Or, if you want an array as a result,

push @array, $1 while /((.)\2*)/g;

Update
Notice that you can't just assign the outcome of the regex to an array, because you'd get redundant results (both $1 and $2 for each match).

# THIS IS WRONG @array = $_ =~ /((.)\2*)/g; print join ", " , map {"<$_>"} @array; __END__ <aaa>, <a>, <bb>, <b>, <cccc>, <c>, <dd>, <d>, <eee>, <e>
 _  _ _  _  
(_|| | |(_|><
 _|   

Replies are listed 'Best First'.
Re: Re: Simple regex question
by QM (Parson) on Oct 23, 2003 at 15:22 UTC
    push @array, $1 while /((.)\2*)/g;

    nicely demonstrates the difference between capturing for backreference and capturing for return value. I wonder if Perl 7 will make that distinction?

    -QM
    --
    Quantum Mechanics: The dreams stuff is made of

Re: Re: Simple regex question
by Anonymous Monk on Oct 23, 2003 at 13:30 UTC
    Thanks for the double quick reply

    I can see it was a mistake trying to use split, which is why I was pratting about with the (?:) grouping in the first place.

    I'm getting older and wiser all the time (well, older anyway)...