tags:

views:

99

answers:

1

I try to replace a sub-str by the content of a valiable where its name matches the sub-str by:

>> str = "Hello **name**"
=> "Hello **name**"
>> name = "John"
=> "John"

str.gsub(/\*\*(.*)\*\*/, eval('\1')) # => error!

the last line in the code above is a syntax error. and:

>> str.gsub(/\*\*(.*)\*\*/, '\1')
=> "Hello name"
>> str.gsub(/\*\*(.*)\*\*/, eval("name"))
=> "Hello John"

what I want is the result of:

str.gsub(/\*\*(.*)\*\*/, eval("name")) # => "Hello John"

any help will be appreciated. thx!

+6  A: 

Try this:

str = "Hello **name**"
name = "John"
str.gsub(/\*\*(.*)\*\*/) { eval($1) }

The gsub method also accepts a block, which will be evaluated and the return value will be used as substitution. The special variables $1, $2, and so forth, are identical to using \1 in a string.

A slightly better alternative than using eval() would be to use a Hash with replacement values:

str = "Hello **name**"
names = { "name" => "John" }
str.gsub(/\*\*(.*)\*\*/) { names[$1] }
molf
Thank you! The Hash way is inspiring.
ohho