in reply to Pattern match location finding

Examine $-[0] for the start location of your match. This will not help you if you wanted to use the /g switch in list context so there you have to fudge.

my @offsets; while ( /B/g ) { push @offsets, $-[0]; }

Replies are listed 'Best First'.
Re: Re: Pattern match location finding
by feloniousMonk (Pilgrim) on Feb 18, 2004 at 23:15 UTC
    I'm seeing something I should have expected - for the given string "AABAABAA" and target "AABAA" my @offsets will have one element whose value = 0. I need it to contain 0 and 3...

    I know what it's doing, when AABAA is matched, it moves on to the end of the match. What I really need is a sliding window type of match. It didn't dawn on me to explain this until I remembered how this works...

    What it's doing:
    *AABAA*BAA - matches here
    AABAA*BAA regex continues at the asterisk,
    but I want it to continure here:
    A*ABAABAA
    i.e., i guess you could say I need a single-width assertion...
    --
      Reset pos() to 1 + $-[0] so you're ready for the next character then.
        You could also use a zero width lookahead. Just leave one character out of the zero width lookahead to increment pos().
        use strict; my $mystring = "AABAABAA"; my @array; {} while $mystring =~ /A(?=ABAA)(?{push @array, pos($mystring)})/g; print join(",", @array),"\n"; #or without any fancy "experimental" regex stuff @array=(); while ($mystring =~ /A(?=ABAA)/g) { push @array, pos($mystring) } print join(",", @array),"\n"; __OUTPUTS__ 1,4 1,4
        That is the 1 based position shown in the original post. If you want 0 based just use push @array, pos($mystring)-1

        --

        flounder