Quote perlop:
In scalar context, each execution of "m//g" finds the next match, returning true if it matches, and false if there is no further match. The position after the last match can be read or set using the pos() function; see "pos" in perlfunc. A failed match normally resets the search position to the beginning of the string, but you can avoid that by adding the "/c" modifier (e.g. "m//gc"). Modifying the target string also resets the search position.
So your regex was doing a search in each string and remembering always were it left off. With the first call it found 'exception:' in the string, with the second it reached the end of the string because there is no second "expection:" in any of the strings. Try this:
my @strings = qw(exception:texexception: exception:mex ... *** produces: $VAR1 = [ 'exception:texexception:', 'exception:mex', 'exception:mex', 'exception:mex', 'exception:mex' ]; $VAR1 = [ 'exception:texexception:' ]; $VAR1 = [ 'exception:mex', 'exception:mex', 'exception:mex', 'exception:mex' ]; $VAR1 = [ 'exception:texexception:' ];
You see that the second "expection:" is found in the odd calls
To inspect behaviour, you could call perl with the parameter -Dr which provides extensive regex debugging
In reply to Re: strange behavior of grep with global match
by jethro
in thread strange behavior of grep with global match [resolved]
by ig
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |