Perl正则表达式,避免不必要的插值

时间:2014-02-25 16:46:11

标签: regex perl

考虑这个例子,

    $relPath = '..\A\B/C/D/E';
    $contentsDir = '..\A\B';
    $relPath =~ s/$contentsDir//;
    print "$relPath\n";

    #Desired output: '/C/D/E'
    #Actual output: '..\A\B/C/D/E'

请帮助..这种不必要的插值使得无法计算它。

2 个答案:

答案 0 :(得分:5)

  1. 不要在路径中混合斜杠和反斜杠。只使用斜杠。
  2. 如果要忽略字符串中的任何正则表达式字符,请将其放在\Q\E之间(请参阅perlre中的文档或将其传递给quotemeta。< / LI>

    以下是一个例子:

    #!/usr/bin/perl -w
    use strict;
    
    my $string = 'abc.*def';
    my $sub = '.*';
    
    $string =~ s/c\Q$sub\E/d/;
    # or $string = 'c' . quotemeta($sub) . 'd';
    
    print $string;  # abef
    

答案 1 :(得分:4)

在匹配之前引用quotemeta的特殊正则表达式字符,

$contentsDir = quotemeta '..\A\B';