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

I have
$a="a "; foreach (1..(length $a)) { print "a(".$1.")(".$2.")\n" if ( $a =~ m/^a( {$_})( )/ ) ; }
This prints
a( )( ) a( )( ) a( )( )
Does anyone know a way to write a single regexp ($regexp) that results in the same output when inserted into the following code?
$a="a "; while ( $a =~ m/$regexp/ ) { # or m//g, m//gc, ... print "a(".$1.")(".$2.")\n"; }
Thanks for any help

regards,
almaric

Replies are listed 'Best First'.
Re: With one regexp
by BrowserUk (Patriarch) on Feb 29, 2004 at 12:49 UTC

    Something like this?

    $s ='a123456789'; $p = 0; print "a($1)($2)\n" while ++$p and $s =~ m[^a(.{$p})(.)]; a(1)(2) a(12)(3) a(123)(4) a(1234)(5) a(12345)(6) a(123456)(7) a(1234567)(8) a(12345678)(9)

    I put numbers in so I could see what was going on, but it works fine with spaces too.

    $s ='a '; $p = 0; print "a($1)($2)" while ++$p and $s =~ m[^a( {$p})( )]; a( )( ) a( )( ) a( )( ) a( )( ) a( )( ) a( )( )

    Update: Or if you like cute, you can do away with the external loop and use backtracking.

    $s ='a '; $s =~ m[^a(.+?)(.)(?{ print "a($1)($2)" })(?!)]; a( )( ) a( )( ) a( )( ) a( )( ) a( )( ) a( )( )

    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail