in reply to strange behavior of grep with global match [resolved]
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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: strange behavior of grep with global match
by ig (Vicar) on Aug 07, 2009 at 10:14 UTC | |
by jethro (Monsignor) on Aug 07, 2009 at 13:49 UTC |