in reply to interpolating preset strings in variable context (or something like that)
As Zaxo mentioned, you can use eval to do this, but it's not ideal. It can easily cause all sorts of hard to debug behavior, not to mention gaping security holes. I would rather approach it using a printf-like template. And instead of pulling the values from named variables directly, pull them from a hash. Here's an example:
my $template = "Hi %foo, I have a %bar.\n"; print fill($template, foo => 'mickey', bar => 'robot'); sub fill { my $template = shift; my %params = @_; $template =~ s/%([a-z]+)/$params{$1}/g; return $template; }
Update: I just noticed that the string you want to "fill in" looks like a function call. Maybe instead of a template type thing, you're actually looking to do a delayed call with different values? If that's the case, then you might be able to get away with a callback using closures.
my ($x, $y, $z); my $callback = sub { print $x, $y, $z, "\n" }; ($x, $y, $z) = (1, 2, 3); $callback->(); ($x, $y, $z) = (4, 5, 6); $callback->();
Update2: Another possiblity:
my $callback = sub { my ($x, $y, $z) = @_; print $x, $y, $z, "\n"; }; $callback->(1,2,3); $callback->(4,5,6);
I suppose, rather than randomly trying to guess exactly what you're doing, I should ask: What exactly are you doing? All you've given us to work with is the solution you've come up with, but we'd really be more help if you told us the actual problem you're trying to solve.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: interpolating preset strings in variable context (or something like that)
by mickey (Acolyte) on Mar 14, 2005 at 22:47 UTC | |
by Mugatu (Monk) on Mar 14, 2005 at 23:10 UTC |