in reply to Regex Pop Quiz with .*, /g, and /s

I'm not really into the quiz thing (except maybe in the polling section), so I just ran it.

It makes my brain hurt. Basically, when you replace something that can have zero width, you're headed for a land of confusion (stop by and say hi; I hang out there a lot).

Replies are listed 'Best First'.
Re^2: Regex Pop Quiz with .*, /g, and /s
by ikegami (Patriarch) on Oct 02, 2007 at 18:22 UTC

    Since you haven't used the /m modifier, Perl won't treat it as a "single line".

    No. That's backwards. Single-line is the default. m switches to (m)ultiline mode.

    Furthermore, m only affects the defintion of ^ and $. Since neither are used here, whether m is present or absent is irrelevant.

    The replacement first takes off the first three characters (which includes the newline), and then it goes for another pass to get the last two characters.

    No. In fact, the \n is a red herring. The same problem occurs with my $string = "1234";.

    The first pass sees the characters at pos 0 to 3 replaced with "go", setting pos = 4.
    The second pass sees the characters at pos 4 to 4 replaced with "go", setting pos = 4.
    The third pass ends the g loop since the only possible match would start and end at the same positions as the second pass.

    my $string = "1234"; $string =~ s/.*/print("($&)");'go'/egs; # (1234)()

    What I find most interesting, however is that the /g seems to have something to do with it too. That is /ms does one replacement

    With and without g, both regex do the same first substitution. With g, it proceeds to do other possible substitutions. That's the very definition of g.