http://qs321.pair.com?node_id=163907

I was helping a coworker with some regular expressions, and I realized he didn't understand several of the nuances of s///g. So I thought I would write out a few examples. For fun, I gave Tye a quiz to see if he could determine (without Perl) what the value of $_ would be after each regex. He aced it. (Of course.) Can you do the same?

For each regex, $_ starts out with '1234*5678'.
   s/(.\d)\d/$1/g;
   s/(.\d)\d+/$1/g;
   s/(.\d)\d\d?/$1/g;
   s/(?<=.)(\d)\d/$1/g;
   s/(?<=\d)(\d)./$1/g;
   s/(?<=\d)(\d)\d/$1/g;
   s/(?<=\D)(\d)\d/$1/g;
   s/(?<!^)\d+(\d)/$1/g;

Here is some code to help you check your answers:

#!perl use strict; my $nums = "1234*5678"; my @regexes = ( q/(.\d)\d/, q/(.\d)\d+/, q/(.\d)\d\d?/, q/(?<=.)(\d)\d/, q/(?<=\d)(\d)./, q/(?<=\d)(\d)\d/, q/(?<=\D)(\d)\d/, q/(?<!^)\d+(\d)/, ); $^A = ""; for my $regex ( @regexes ) { my $target = $nums; $target =~ s/$regex/$1/g; formline "\$_ = '$nums'; \@<<<<<<<<<<<<<<<<<<<<<<< ". "# Result: \$_ eq '$target'\n", "s/$regex/\$1/g;"; print $^A; $^A = ""; }
By the way, Tye isn't sure that all the cases are as obvious as one might think. In fact, we are pretty sure that some of the behavior demonstrated is undocumented. Enjoy!