in reply to Re: Pattern match location finding
in thread Pattern match location finding

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...
--

Replies are listed 'Best First'.
Re: Re: Re: Pattern match location finding
by diotalevi (Canon) on Feb 19, 2004 at 00:01 UTC
    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

        That's a good idea. I don't think I recommended anything esperipmental thpogh.