Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re: qr for recursive regex?

by Limbic~Region (Chancellor)
on May 28, 2014 at 18:29 UTC ( [id://1087699] : note . print w/replies, xml ) Need Help??

in reply to qr for recursive regex?

I am not sure why you are looking for a recursive regex here. Instead, I would simply match globally (perhaps as an iterator) and count how many matches I had:
my @result = $prBoundaryString =~ m{$coord}g; # check if scalar (@result / 2) % 2 == 1 # or my $count = 0; while ($prBoundaryString =~ m{$coord}g) { my ($x, $y) = ($1, $2); $count++; }
Sorry I had to rush this so it is untested and it may not be explained enough but I hope it makes sense.

Cheers - L~R

Replies are listed 'Best First'.
Re^2: qr for recursive regex?
by darisler (Initiate) on May 28, 2014 at 19:15 UTC
    The example I posted is simplified - perhaps too much.

    I really want repetition, not recursion, but ran into roadblock with perl behaviour of only returning the last matches. Here is what I first tried, it only returns the last coordinate pair, which is documented behaviour.

    #!/usr/bin/env perl use v5.16; use strict; my $prBoundaryString = <<endPrBoundary; '( (0.01 0.02) (0.0 1328.23) (0.03 0.04) ) endPrBoundary say "prBoundaryString=$prBoundaryString"; my ($coord,$coords); $coord = qr{ \(\s* (?<x>[\-\.0-9]+)\s+ (?<y>[\-\.0-9]+)\s* \)\s* }x; $coords = qr{ ( ( $coord )+ ) }x; $prBoundaryString =~ m{ \'\(\s*\s* $coords \)\s*$ }x || die "parsePrBoundary: Error parsing prBoundary"; say "-x0=$-{x}[0]"; say "-y0=$-{y}[0]"; say "-x1=$-{x}[1]"; say "-y1=$-{y}[1]"; say "-x2=$-{x}[2]"; say "-y2=$-{y}[2]";
    output: - it only gets the last coordinate.
    prBoundaryString='( (0.01 0.02) (0.0 1328.23) (0.03 0.04) ) -x0=0.03 -y0=0.04 -x1= -y1= -x2= -y2=
      If you use a regex with the global modifier in scalar context, you will get an iterator allowing you to go through each set of matches one at a time (like one of the examples above):
      while ($str =~ m{$your_regex}g) { my ($x, $y) = ($1, $2); # This loop will repeat for as many matches as are in $str }

      Cheers - L~R