2009-04-15 91 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) = @_; 
    # ... 
}