2014-02-25 111 views
0

考慮這個例子,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' 

請幫助..這種不必要的插補,不可能計算這一點。

+0

試試這個's \ \ Q $ contentsDir \ E //' – sln

+0

或者$ contentDir =''\。\。\\ A \\ B''; – sln

回答

4

在匹配前引用quotemeta特殊正則表達式字符,

$contentsDir = quotemeta '..\A\B'; 
5
  1. 不要在路徑中混合使用斜槓和反斜槓。只需使用斜線。
  2. 如果你想忽略字符串中的任何正則表達式的字符,把它\Q\E之間(見文檔中perlre或把它傳遞給quotemeta

下面是一個例子:

#!/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