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

4

我在 Perl 中有以下代码:

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

$_[2]是定界符变量,$_[1]是可能存在定界符的字符串。($_[0]在其他地方使用)通过这些变量名可以猜测这段代码位于子程序中。

无论如何,进入我的问题,当我的定界符是一些无害的字符,比如'a'':',那么这段代码就像应该的那样工作。然而,当它是一些Perl正则表达式会解析的字符,比如'\'字符时,它就不像应该的那样工作。这是有道理的,因为在split函数中,Perl会看到类似以下的内容:

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

这对于IT技术来说毫无意义,因为它希望得到这样的结果:
split (/\//, $_[1]);

考虑到这些问题,我的问题是:“如何使我放入$_[2]的任何分隔符或所有ASCII字符都被视为其应该是的字符,而不是被解释为其他内容?”

提前感谢您,

罗伯特


1
可能是如何在Perl正则表达式中处理特殊字符?的重复问题。 - daxim
3个回答

13

您可以使用quotemeta函数来正确转义$_[2],以便在正则表达式中正常工作而不会出现混乱。以下是实现方法:

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

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


谢谢,它一开始就运行正常。问题解决了。给你一个赞。 - Robert Massaioli

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

1
你说得对,这是我可以做的方法之一,但是我的票必须给另一个人,因为他的一开始就完美地运作了。这会导致一个错误。 - Robert Massaioli
除了PEBKAC之外,您认为还有什么问题吗?否则,这个答案和其他回答一样好。 - runrig
对不起,这是我的错,它工作得很好。然而,Friedo提供了更多的信息和描述,所以我不会因选择他的答案为最佳答案而感到太糟糕; 很抱歉,但我仍然会保留我的选择。runrig: 没有理由说PEBKAC(问题存在于键盘与椅子之间);显然我是新手。 - Robert Massaioli
我并不是在抱怨“正确”答案的选择,只是想看看我的帖子是否需要更新;-) - Tanktalus

1
作为一点说明,我怀疑$_[1]$_[2]变量指的是子程序自动传入的@_数组。
在子程序开头使用以下类似代码非常有用——它可以节省很多解释的时间,并且让你的代码更加易懂:
sub mysub {
  my ($param1, $string, $delim) = @_;
  # ...
}

谢谢,我会考虑这个建议的,但是我对Perl还比较新手,发现自己有点过于像C语言来处理它。所以感谢你提醒我。 - Robert Massaioli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接