4

我在 Perl 中有以下代码:

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

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

无论如何,关于我的问题,当我的分隔符是无害的'a'或者':'代码像它应该的那样工作时。然而,当它是由 Perl 正则表达式解析的东西时,比如一个'\'字符,那么它就不会像它应该的那样工作。这是有道理的,因为在 split 函数中 Perl 会看到如下内容:

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

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

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

因此,考虑到所有这些,我无法回答的问题是这样的:“我如何做到这一点,以便我输入的任何分隔符$_[2]或所有 ASCII 字符都被视为应该是的字符,并且不被解释为别的东西?”

提前致谢,

罗伯特

4

3 回答 3

13

您可以使用quotemeta正确转义$_[2],这样它就可以在正则表达式中工作而不会被破坏。这应该这样做:

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

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

于 2009-04-15T22:47:02.830 回答
6
split /\Q$_[2]/, $_[1]
于 2009-04-15T22:46:46.030 回答
1

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

It's helpful - would have saved you quite some explaining here and made your code more understandable by itself - and common practice to use something like the following at the beginning of the sub:

sub mysub {
  my ($param1, $string, $delim) = @_;
  # ...
}
于 2009-04-16T09:50:47.400 回答