In my perl script I want to have both versions of $config directory:
my $config='$home/client/config';
and
my $config_resolved="$home/client/config";
But I want to get $config_resolved from $config, i.e. something like this:
my $config_resolved=resolve_vars($config);
How can I do such thing in perl?
From the Perl FAQ (which every Perl programmer should read at least once):
How can I expand variables in text strings?
(contributed by brian d foy)
If you can avoid it, don't, or if you can use a templating system, such as Text::Template or Template Toolkit, do that instead. You might even be able to get the job done with
sprintforprintf:my $string = sprintf 'Say hello to %s and %s', $foo, $bar;However, for the one-off simple case where I don't want to pull out a full templating system, I'll use a string that has two Perl scalar variables in it. In this example, I want to expand
$fooand$barto their variable's values:my $foo = 'Fred'; my $bar = 'Barney'; $string = 'Say hello to $foo and $bar';One way I can do this involves the substitution operator and a double
/eflag. The first/eevaluates$1on the replacement side and turns it into$foo. The second/estarts with$fooand replaces it with its value.$foo, then, turns into 'Fred', and that's finally what's left in the string:$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'The
/ewill also silently ignore violations of strict, replacing undefined variable names with the empty string. Since I'm using the/eflag (twice even!), I have all of the same security problems I have with eval in its string form. If there's something odd in$foo, perhaps something like@{[ system "rm -rf /" ]}, then I could get myself in trouble.To get around the security problem, I could also pull the values from a hash instead of evaluating variable names. Using a single
/e, I can check the hash to ensure the value exists, and if it doesn't, I can replace the missing value with a marker, in this case???to signal that I missed something:my $string = 'This has $foo and $bar'; my %Replacements = ( foo => 'Fred', ); # $string =~ s/\$(\w+)/$Replacements{$1}/g; $string =~ s/\$(\w+)/ exists $Replacements{$1} ? $Replacements{$1} : '???' /eg; print $string;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With