Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^4: Can you assign to pos() in a s/foo/bar/g

by johngg (Canon)
on Feb 25, 2010 at 14:39 UTC ( #825303=note: print w/replies, xml ) Need Help??


in reply to Re^3: Can you assign to pos() in a s/foo/bar/g
in thread Can you assign to pos() in a s/foo/bar/g

I'm not sure you need the complication of oha's method here as it depends on the fact that the left side of the alternation will still match once you have done the first substitution whereas in your problem it won't. Using just a capture group seems to work.

$ perl -E ' > $_ = q{Bla class="x1" class="x2" class="x3" Blabla}; > say; > s{" class="([^"]+)}{ $1}g; > say;' Bla class="x1" class="x2" class="x3" Blabla Bla class="x1 x2 x3" Blabla

Attacking the problem from (literally) a different direction would be another way of achieving the same result without a capture group.

$ perl -E ' > $_ = q{Bla class="x1" class="x2" class="x3" Blabla}; > say; > $r = reverse $_; > $r =~ s{"=ssalc "}{ }g; > $_ = reverse $r; > say;' Bla class="x1" class="x2" class="x3" Blabla Bla class="x1 x2 x3" Blabla $

I hope this is helpful.

Cheers,

JohnGG

Update: I forgot to mention, double-quotes are not regex metacharacters so they don't need to be escaped.

Replies are listed 'Best First'.
Re^5: Can you assign to pos() in a s/foo/bar/g
by Jaikov (Initiate) on Feb 25, 2010 at 23:21 UTC

    Thx John, your tip was very helpful, as it gives me the right idea...

    Perhaps I did not explain good enough the scenario. But both your solutions have a little error, example:
    "Bla class="x1" class="x2" otheratr="y0" class="x3" Blabla
    ==> Bla class="x1 x2" otheratr="y0 x3" Blabla
    correct would be:
    Bla class="x1 x2" otheratr="y0" class="x3" Blabla
    (perfect would be:
    Bla class="x1 x2 x3" otheratr="y0" Blabla)

    one-pass solution:

    s/(?<=class=")([^"]*)"\s*class="/$1 /g;

    But for smaller files with few iterations the while-loop solution is faster, probably because of the lookbehind operator.

    1 while $s1 =~ s/class=\"([^\"]*)\"\s*class=\"([^\"]*)\"/class="$1 $2"/g;

    Thx again,
    Jaikov

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://825303]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2020-10-31 10:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (287 votes). Check out past polls.

    Notices?