Nightmare with gsub & friends

Dear List,

took me hours to find out, where my backslashes magically disappeared.
finally found something like this:

r = "value: <% replace_me %>"
s = "\"\\\" some quotations \\\" \\\\\\\"really weird quotation\\\\\\\"\""

# try a regexp
reg = /(<%\s*replace_me\s*%>)/
p r.gsub(reg, s)
# => "value: \"\\\" some quotations \\\" \\\\\"really weird
quotation\\\\\"\""

while its documented and arguable that backslashes are interpreted they
should not disappear IMHO

no_reg = "<% replace_me %>"
p r.gsub(no_reg, s)
# => "value: \"\\\" some quotations \\\" \\\\\"really weird
quotation\\\\\"\""

but if we use no regexp it really makes no sense to interpret backslashes
here. who needs/expects this?

p r.gsub(no_reg, '\1\2')
# => "value: "

If you use lots of regexps in a recursive loop down a chain of in string
substitutions such things are really hard to debug, believe me.

Now the solution is to use a block instead of the second parameter.

p r.gsub(no_reg){ s }
# => "value: \"\\\" some quotations \\\" \\\\\\\"really weird
quotation\\\\\\\"\""

In fact I do need the bahaviour with the block a lot more often than \1 &
friends. So I am going to replace it everywhere in my code.

Just wanted to share the experience, I guess there might be some people out
there who weren't aware of that behaviour.

It wasn't the principle of my least surprise this time :slight_smile:

have a good night,

benny