如何在Perl正则表达式中处理每个ASCII字符(包括正则表达式特殊字符)?

时间:2009-04-15 22:39:22

标签: regex perl ascii split delimited-text

我在Perl中有以下代码:

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

$_[2]是分隔符变量,$_[1]是分隔符可能存在的字符串。($_[0]在别处使用)您可能已经猜到此代码在子例程中那些变量名。

无论如何,在我的问题上,当我的分隔符是像'a'':'那样无害的代码时,代码就像它应该的那样。但是,当它被Perl正则表达式解析时,就像'\'字符一样,那么它就不会像它应该的那样工作。这是有道理的,因为在分割函数Perl会看到类似的东西:

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

根本没有意义,因为它会想要这个:

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

所有这一切都考虑到我的问题,我无法回答,是:“我如何做到这一点,以便我放入$_[2]或所有ASCII字符的任何分隔符被视为它应该是什么角色而不是被解释为其他东西?“

提前致谢,

罗伯特

3 个答案:

答案 0 :(得分:13)

您可以使用quotemeta正确转义$_[2],以便它可以在正则表达式中运行而不会受到损坏。这应该这样做:

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

或者,您可以在正则表达式中使用\ Q来逃避它。请参阅perlre中的“转义序列”。

答案 1 :(得分:6)

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

答案 2 :(得分:1)

作为旁注,我怀疑$_[1]$_[2]变量是指自动传入的子@_数组。

这很有帮助 - 本来可以为你节省一些解释并让你的代码更容易理解 - 并且通常的做法是在sub的开头使用类似下面的内容:

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