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

    Thanks for the pointer to -Dr. I guess this is different from use re 'debug' as the latter works but I will have to recompile perl with -DDEBUGGING to try -Dr.

    Pointers to any documentation that will help me understand the (I assume) non-trivial output that will be produced would be greatly appreciated. I know of perlreguts, though I'm not very familiar with it and will have to look again.

    When the only tool you know is gdb everything looks like an object module, and your head hurts

      There seems to be not much difference between the output of the two. The advantage of re debug is that you can turn it on and off (with "no re 'debug';") inside the script to limit the output you are getting.

      Here is a diff between the output of the two debug methods on your program (without warnings,data::dumper, strict, as these produce output too):

      1a2 > rarest char : at 9 6a8 > rarest char x at 2 11a14,17 > Omitting $` $& $' support. > > EXECUTING... >

      As you can see there are only 4 non-empty lines different between the two