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

If I understand you correctly, (see how (not) to ask a question) You want to eval $body as a string, but since you're using the eval { BLOCK } syntax it isn't.
print eval $body;
But you can much more easily (and definitely more safely) use variable interpolation:
print "Foo$foo";
See also perlop on Quote operators

Replies are listed 'Best First'.
Re^2: Form letters: eval a string to substutite perl variables
by brycen (Monk) on Oct 27, 2006 at 22:38 UTC
    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?
      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\"";