Interpolating a string loaded from a text file

J

John Elrick

Hoping you guys can help out here. Is there any way to interpolate a
string that is loaded dynamically?

I know that in Ruby I can do this:

my_message = 'Hello World'
my_template = "The message is #my_message"
puts my_template <== The message is Hello World

But what I want to do is

my_message = 'Hello World'
my_template =
File.readlines('my_template_file.txt').HOW-CAN-I-FORCE-INTERPOLATION???
puts my_template <== The message is Hello World


Anyone have any ideas? Or am I missing something blatantly obvious?

TIA

John Elrick
 
R

Robert Klemme

John Elrick said:
Hoping you guys can help out here. Is there any way to interpolate a
string that is loaded dynamically?

I know that in Ruby I can do this:

my_message = 'Hello World'
my_template = "The message is #my_message"
puts my_template <== The message is Hello World

But what I want to do is

my_message = 'Hello World'
my_template =
File.readlines('my_template_file.txt').HOW-CAN-I-FORCE-INTERPOLATION???
puts my_template <== The message is Hello World


Anyone have any ideas? Or am I missing something blatantly obvious?

How about:

eval "%Q{" + File.read('my_template_file.txt') + "}"

Kind regards

robert
 
J

James Edward Gray II

Hoping you guys can help out here. Is there any way to interpolate a
string that is loaded dynamically?

I know that in Ruby I can do this:

my_message = 'Hello World'
my_template = "The message is #my_message"
puts my_template <== The message is Hello World

Only if you replace #my_message with #{my_message}. ;)
But what I want to do is

my_message = 'Hello World'
my_template =
File.readlines('my_template_file.txt').HOW-CAN-I-FORCE-INTERPOLATION???
puts my_template <== The message is Hello World


Anyone have any ideas? Or am I missing something blatantly obvious?

Well, there's always search and replace:

template.gsub(/#\{\s*(\w+)\s*\}/) { # do something with $1 here... }

I think that works pretty well with a Hash, keyed by the $1 values to
interpolate.

Option two is to call eval(). This executes Ruby code and returns the
results. This naturally has security concerns, if you aren't in
control of the template.

Finally, you can make use of Ruby's standard template library, ERb:

http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html

Hope that helps.

James Edward Gray II
 
I

Ilmari Heikkinen

ke, 2005-04-06 kello 18:49, Robert Klemme kirjoitti:
How about:

eval "%Q{" + File.read('my_template_file.txt') + "}"

echo "}; 10.times{ puts 'do not trust external data'" > \
my_template_file.txt

Cheers :)
 
R

Robert Klemme

Ilmari Heikkinen said:
ke, 2005-04-06 kello 18:49, Robert Klemme kirjoitti:

echo "}; 10.times{ puts 'do not trust external data'" > \
my_template_file.txt

Cheers :)

Hey, you just spoiled my evil - err - eval plan to take over his system!
:)

robert
 
S

Saynatkari

Le 6/4/2005 said:

Problem is that interpolation is done at the time the String
is first encountered, which may complicate things since the
variable used for substitution may not be available, if I am
understanding correctly.

However, this works in those in situations:

# file-one
str = "Inserted %s."

# file-two
require 'file-one'
puts str % 'this from file two'

E

No-one expects the Solaris POSIX implementation!
 
J

John Carter

Hoping you guys can help out here. Is there any way to interpolate a
string that is loaded dynamically?

This is my print help routine, the help file itself is almost book length,
and contains a bunch of #{expressions} that retrieve information from the
"deliverable_registry" object. (Basically the deliverable_registry
object knows what can be done, what the command line options to select
those actions, the descriptions of those actions etc...)

# Doesn't return.
# If STDOUT is a terminal pipe the help file through "less".
def print_help_and_exit(deliverable_registry, plaint = "")


# Pipe the output through less, unless we are within emacs...
outf = STDOUT
if STDOUT.stat.chardev?() && ENV['TERM'] != 'dumb' then
outf = open( "|less", "w")
outf = STDOUT if !outf
end

eval("
begin
outf.puts <<EOHELP
"+
File.read( "#{WORK_DIR}/Utilities/inc/build_help.txt")+
"
EOHELP # Catch an exit from less
rescue Errno::EPIPE => details
$log_file.print_to_screen = 0 # Don't gibber to the screen about the
# early exit from less
end
")

outf.close if outf != STDOUT

# Write the exit reason to the log file..
$log_file.history plaint
exit(1)

# Catch early exit from less
rescue Errno::EPIPE => details
$log_file.print_to_screen = 0
end




John Carter Phone : (64)(3) 358 6639
Tait Electronics Fax : (64)(3) 359 4632
PO Box 1645 Christchurch Email : (e-mail address removed)
New Zealand

Refactorers do it a little better every time.
 

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

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top