Perl\'s quotemeta operator typically works on the SEARCH side of s///
, but in generating code to be compiled with eval, how should I protect the REPLACEMENT tha
As far as I can tell, perl doesn't do magic things with $replace as long as you don't add the /e flag on the substitute. So quotemeta will always change your result, as it then contains a lot of backslashes.
#!/usr/bin/perl
$test="test";
$literal_replacement='Hello $1, or \1';
my $replace = quotemeta $literal_replacement;
$test =~ s/test/$replace/;
print $test,"\n";
returns:
Hello\ \$1\,\ or\ \\1
Which is probably not what you want :
The replacement is usually processed like a double-quoted string, but you can change that by using single-quotes as the delimiter:
$test =~ s<test>'$replace';
The replacement side is a normal interpolating string (unless you start adding /e
modifiers, in which case it becomes as many string eval
s as there are /e
modifiers.). Perl 5 does not care what is in the variable you interpolate into the string. It is the same as:
my $foo = 5;
my $bar = '$foo';
my $baz = "$foo $bar";
print "$baz\n"; #this is 5 $foo not 5 5