2009-04-15 95 views
4

我有以下代碼中的Perl:如何處理Perl正則表達式中的每個ASCII字符(包括正則表達式特殊字符)?

if (index ($retval, $_[2]) != -1) { 
    @fs = split ($_[2], $_[1]); 

$_[2]是分隔符變量和$_[1]是定界符可以在存在字符串($_[0]在別處使用)你可能已經猜到,此代碼是在。子程序由這些變量名稱。

無論如何,在我的問題上,當我的分隔符是無害的,如'a'':'代碼的工作原理應該是這樣。但是,當它被Perl正則表達式解析時,就像'\'字符一樣,那麼它就不能像它應該的那樣工作。這是有道理的,因爲在分割功能的Perl會看到類似這樣的:

split (/\/, $_[1]); 

這是沒有意義的它,因爲在所有它想這樣的:

split (/\//, $_[1]); 
所有這一切在心中

所以我問題,我無法回答,是這樣的:「我該如何做到這一點,以便我將$_[2]或所有ASCII字符中的分隔符視爲應該是的字符,而不是解釋爲其他字符?」

由於提前,

羅伯特

+1

可能重複[如何處理Perl正則表達式中的特殊字符?](http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim 2011-03-25 14:29:10

回答

13

您可以使用quotemeta逃脫$_[2]適當所以它會在正則表達式的工作,而不會錯位。這應做到:

my $quoted = quotemeta $_[2]; 
@fs = split($quoted, $_[1]); 

或者,你可以使用\的Q你的正則表達式來逃避它。請參閱perlre中的「轉義序列」。

6
split /\Q$_[2]/, $_[1] 
+1

你是對的是我能夠做到的方式之一,但是我的剔必須轉到另一個人身上,因爲他的表現完美無缺。這產生了一個錯誤。 – 2009-04-15 22:52:14

+0

否「@fs =」並且沒有分號?這就是我能想到的(除了PEBKAC)。否則,就像其他答案一樣好。 – runrig 2009-04-15 23:06:23

+0

對不起,這是我的錯,它工作得很好。然而,弗裏多確實給了更多的信息和描述,所以我不覺得選擇他作爲接受的答案太糟糕了;我很抱歉,但我會按原樣離開我的選擇。 runrig:沒有理由說PEBKAC;我顯然是新的。 – 2009-04-16 01:45:23

1

作爲一個附註,我懷疑$_[1]$_[2]變量是指自動傳入的@_子數組。

這是有益的 - 將節省你不少一些解釋這裏本身使你的代碼更容易理解 - 和通常的做法是使用像在子開始的以下內容:

sub mysub { 
    my ($param1, $string, $delim) = @_; 
    # ... 
}