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

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.

Replies are listed 'Best First'.
Re^4: Form letters: eval a string to substutite perl variables
by ikegami (Patriarch) on Oct 27, 2006 at 23:39 UTC
    Single quotes don't interpolate. You mean
    my $value = eval "\"$string\"";

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