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
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Can you assign to pos() in a s/foo/bar/g
by oha (Friar) on Oct 25, 2007 at 12:14 UTC | |
by johngg (Canon) on Oct 25, 2007 at 18:23 UTC | |
Re: Can you assign to pos() in a s/foo/bar/g
by mwah (Hermit) on Oct 25, 2007 at 12:48 UTC | |
by johngg (Canon) on Oct 25, 2007 at 19:06 UTC | |
by Jaikov (Initiate) on Feb 25, 2010 at 12:53 UTC | |
by johngg (Canon) on Feb 25, 2010 at 14:39 UTC | |
by Jaikov (Initiate) on Feb 25, 2010 at 23:21 UTC |
Back to
Seekers of Perl Wisdom