http://www.perlmonks.org?node_id=647133

johngg has asked for the wisdom of the Perl Monks concerning the following question:

There were several suggested methods in answer to this thread. My solution repeatedly substituted in a while loop. I got to wondering if you could do a global substitution in one fell swoop instead by assigning to pos in a regex code block to set the match back to the start of the string. This doesn't seem to work although the assignment to pos() does seem to register. Here's a short script to show what I'm trying, firstly the loop variant then the global substitution.

#!/usr/local/bin/perl -l # use strict; use warnings; $_ = q{DFR7234C__A_B_C_Bonzo_Dog_D_B}; print; 1 while s { (?<=__) [A-Z]_ } {}x; print; print q{-} x 25; $_ = q{DFR7234C__A_B_C_Bonzo_Dog_D_B}; print; s { (?<=__) [A-Z]_ (?{ print pos(); pos() = 0; print pos() }) } {}gx; print; print q{-} x 25;

Here's the output

DFR7234C__A_B_C_Bonzo_Dog_D_B DFR7234C__Bonzo_Dog_D_B ------------------------- DFR7234C__A_B_C_Bonzo_Dog_D_B 12 0 DFR7234C__B_C_Bonzo_Dog_D_B -------------------------

As you can see, it doesn't look as if matching is reset so only one substitution is done. Am I trying to do something impossible here?

Cheers,

JohnGG