Perl metaprogramming: when is it unsafe to use quotemeta on the REPLACEMENT value of s///?

后端 未结 3 433
小蘑菇
小蘑菇 2021-01-14 16:25

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

相关标签:
3条回答
  • 2021-01-14 16:55

    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 :

    0 讨论(0)
  • 2021-01-14 16:56

    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';
    
    0 讨论(0)
  • 2021-01-14 17:01

    The replacement side is a normal interpolating string (unless you start adding /e modifiers, in which case it becomes as many string evals 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
    
    0 讨论(0)
提交回复
热议问题