turning off interpolation in a regex

J

Jason Perkins

I need to be able to find a run of characters (like *count*) in a
string and substitute in the value #{object.count} so that I'm left
with a string that can itself be interpolated. The method for doing
this that jumped out was to use the string's gsub method like this:

original_string.gsub(/\*count\*/, /count of #{object\.count}/

(Old hands at Ruby are now chuckling, and rightly so) How do I go
about getting the literal text in the substitution portion without
getting an, "NameError: undefined local variable or method `object'
for main:Object"?

Any assistance, pointers or suggestions appreciated.

--
Jason Perkins
(e-mail address removed)

"The computer allows you to make mistakes
faster than any other invention, with the
possible exception of handguns and tequila."
 
J

Joel VanderWerf

Jason said:
I need to be able to find a run of characters (like *count*) in a string
and substitute in the value #{object.count} so that I'm left with a
string that can itself be interpolated. The method for doing this that
jumped out was to use the string's gsub method like this:

original_string.gsub(/\*count\*/, /count of #{object\.count}/

(Old hands at Ruby are now chuckling, and rightly so) How do I go about
getting the literal text in the substitution portion without getting an,
"NameError: undefined local variable or method `object' for main:Object"?

s = original_string.gsub(/\*count\*/, 'count of #{object.count}')

# set object somehow

eval "\"#{s}\""
 
J

Jason Perkins

s = original_string.gsub(/\*count\*/, 'count of #{object.count}')

# set object somehow

eval "\"#{s}\""

Thank you, Joel.

--
Jason Perkins
(e-mail address removed)

"The computer allows you to make mistakes
faster than any other invention, with the
possible exception of handguns and tequila."
 
R

Robert Klemme

Jason said:
Thank you, Joel.

Um, I find this piece of code a bit weired. If you determine object
*before* doing the substitution eval isn't needed at all. Maybe there
is some piece of information about the problem missing, but this
approach is preferred IMHO:

object = ...
original_string.gsub(/\*count\*/, "count of #{object.count}")

If you can only determine the value to insert during replacement then
there's always the block form:

original_string.gsub(/\*count\*/) {|m| "count of #{object.count}"}

or if you need the position, i.e. the length of the prematch

original_string.gsub(/\*count\*/) {|m| "count of #{$`.length}"}

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top