Interpolating a string loaded from a text file

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

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}. :wink:

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

···

On Apr 6, 2005, at 10:34 AM, John Elrick wrote:

"John Elrick" <john.elrick@gmail.com> schrieb im Newsbeitrag
news:1112801469.561320.13590@z14g2000cwz.googlegroups.com...

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

Will using Kernel#sprintf work achieve the same thing?
--Vraj Mohan

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 : john.carter@tait.co.nz
New Zealand

Refactorers do it a little better every time.

···

On Thu, 7 Apr 2005, John Elrick wrote:

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

"Vraj Mohan" <vrajmohan@comcast.net> schrieb im Newsbeitrag
news:42540521.7030801@comcast.net...

Will using Kernel#sprintf work achieve the same thing?
--Vraj Mohan

No.

    robert

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

"John Elrick" <john.elrick@gmail.com> schrieb im Newsbeitrag
news:1112801469.561320.13590@z14g2000cwz.googlegroups.com...
> 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') + "}"

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

Cheers :slight_smile:

"Ilmari Heikkinen" <kig@misfiring.net> schrieb im Newsbeitrag
news:1112805304.14517.5.camel@jugend...

ke, 2005-04-06 kello 18:49, Robert Klemme kirjoitti:
> "John Elrick" <john.elrick@gmail.com> schrieb im Newsbeitrag
> news:1112801469.561320.13590@z14g2000cwz.googlegroups.com...
> > 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') + "}"
>

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

Cheers :slight_smile:

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

    robert

"Vraj Mohan" <vrajmohan@comcast.net> schrieb im Newsbeitrag
news:42540521.7030801@comcast.net...

Will using Kernel#sprintf work achieve the same thing?
--Vraj Mohan

No.

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'

   robert

E

No-one expects the Solaris POSIX implementation!

···

Le 6/4/2005, "Robert Klemme" <bob.news@gmx.net> a écrit:

Thanks to all who have replied. I appreciate all the solutions.

Best,

John