2012-09-06 70 views
0

我使用Perl與perl的查找和替換../和 

分別/ ,以取代

../../../../../../abc' 

所有實例的字符串。

的方法,我用這樣的容貌:

sub encode 
{ 
    my $result = $_[0]; 
    $result =~ s/..\/..\/..\/..\/..\/..\//\//g; 
    $result =~ s/ / /g; 
    return $result; 
} 

這是正確的嗎?

+2

什麼測試用例告訴你關於它的正確性? :) – hobbs

回答

0

試試這個。它將打印/foo bar/baz

#!/usr/bin/perl -w 
use strict; 
my $result = "../../../../../../foo bar/baz"; 

#$result =~ s/(\.\.\/)+/\//g; #for any number of ../ 
$result =~ s/(\.\.\/){6}/\//g; #for 6 exactly 

$result =~ s/ / /g; 
print $result . "\n"; 
+0

如果我想指定有6組'../',那麼該怎麼辦? – mmcc

1

本質上說,是的,雖然第一次正則表達式已經被寫入以不同的方式:因爲.任何字符相匹配,我們要逃跑呢\.或把它放在自己的字符類[.]。第一個正則表達式也可以寫成清洗器

...; 
$result =~ s{ (?: [.][.]/){6} } 
      {/}gx; 
...; 

我們期待爲面值模式../重複6次,然後替換它。因爲我使用大括號作爲分隔符,所以我不必逃避斜線。因爲我使用/x修飾符,所以我可以在正則表達式中使用這些空格來提高可讀性。

0

你忘了ABC,我想:

sub encode 
{ 
    my $result = $_[0]; 
    $result =~ s/(?:..\/){6}abc/\//g; 
    $result =~ s/ / /g; 
    return $result; 
}