Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^2: Form letters: eval a string to substutite perl variables

by brycen (Monk)
on Oct 27, 2006 at 22:38 UTC ( [id://581036]=note: print w/replies, xml ) Need Help??


in reply to Re: Form letters: eval a string to substutite perl variables
in thread Form letters: eval a string to substutite perl variables

Here's what I want to do more clearly. Given a file:
"Dear $row->{name}; thanks for giving us money."
I want to slurp it in:
undef($/); $block = <FILE>;
Then substitue in a loop:
$sql = "select email,name from database"; while( $row=getrow($sql) ) { print "Working on $row->{name}\n"; eval{$block); send_email($row->{email},$block); }
The idea is to use perl syntax and the perl parser for the substitution, rather than a made up syntax (e.g. %NAME% and s/%NAME%/$name/). Is this crazy?

Replies are listed 'Best First'.
Re^3: Form letters: eval a string to substutite perl variables
by Joost (Canon) on Oct 27, 2006 at 22:50 UTC
    Alright, one remark up front: read up on the difference between eval {block} and eval $string. It's crucial.

    But also consider this: eval $string is for interpreting strings as code, not for variable substitution. Let's say you've got a string

    my $string = 'some $stuff I want to $interpolate';
    You can now eval $string to interpolate $stuff and $interpolate, but... You need to add quotes:

    my $value = eval "'$string'";
    update there's a bug here. read ikegami's reply.

    The problem with this, is that you can't know if there are any quotes in $string, so you need to escape the quotes in $string before eval()ing. Also, it will interpolate anything that looks like a variable. Even if the variable in question shouldn't be interpolated at all.

    In general, if you want to give your users the maximum amount of control, use eval. In any other case, you're better off using a templating language. You might even use something like Text::Template, which is fast and works more or less like perl. If you want to use something simple that's more strict in its input, use something like GrandFather's post.

      Single quotes don't interpolate. You mean
      my $value = eval "\"$string\"";

        Or eval qq{"$string"}; for less backwhackititus.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://581036]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (5)
As of 2024-03-28 19:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found