This behaviour is intended and documented. Consider the following:

for ("I am a fish","I am a nonfish","I am a nonfish","fish I am a") { print "Start> $_\n"; if (/\GI\s*/g) { print "I\n"; if (/\Gam a\s*/g) { print "am a\n"; if (/\Gfish/g) { print "Yah! I am a fish\n"; } } } }

In other words, /g in a scalar context allows multiple distinct regexes to match after each other but from the place where the previous left off. This is very useful behaviour and is well worth familiarizing yourself with.

BTW, part of the reason that those constructs are marked experimental is because they allow sideeffects, which means that if the behaviour of the regex engine changes there is no guarantee the same side effects will occur. A good example is the following regex:

$_="aiutino aiutino aiutino fnorbley"; / \b aiutino \b \s* (?{ warn "Argh!" }) fnorbletrx /gix;

Note that it doesnt warn AT ALL. The reason is the longest fixed string in the pattern is 'fnorbletrx' but the string does not contain this pattern, and so the regex never runs as a regex. Which means the warn is never executed. In fact this pattern and this string is more like /.../ if instr($_,'fnorbletrx'); Its worth remembering this isa very common optimisation. Any regex that involves a mandatory constant string will automatically use this logic internally.

---
$world=~s/war/peace/g


In reply to Re: /g matches not really global in scalar context! by demerphq
in thread /g matches not really global in scalar context! by blazar

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.