Can anyone explain why this is happening. I’m convinced it shouldn’t ever
happen.
I’m sorry, but you’re wrong. When you pass “\#{$1}” to gsub the
string is evaluated once and even worse, the value of $1 at time of
call has nothing to do with this gsub operation. gsub did not even
start matching at this point in time.
The second replacement apparently works because it gets $1 from the
first execution…
You also do not need the grouping because the group covers the whole
match anyway. You rather want a special replacement expression:
Note, the high number of backslashes is necessary because there are two
levels of escaping: first the string, i.e. you need two backslashes to
have one backslash in the string. Then you need to escape the backslash
you want to insert into the replacement because backslash is a
metacharacter in the substitution string itself.
=> nil
I was thinking about including a statement about the block form but
decided against - now you made me write it anyway…
IMHO the block form should be restricted to cases where substitutions
should be done that cannot be implemented with simple pattern
replacement (e.g. inserting a match counter, doing lookups somewhere
etc.). This is mainly because I find the non block form more
appropriate if you are only doing pattern replacements but it also has
the nice side effect of being more efficient. Use the right tool for
the job.
Kind regards
robert
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.