在Perl匹配中使用$ 1时无法识别的转义

时间:2017-09-28 08:38:25

标签: regex perl

我有这场比赛

$line =~ s/(.*?$)/$1\n(\s){$array[0]}/;

给出错误

Unrecognized escape \s passed through

有人可以告诉我为什么使用$1会抛出此错误。在我的文本编辑器中,如果我添加或删除$1(颜色在特殊解释字符时表示颜色),颜色也会发生变化。

另外,(\s){$array[0]}是正确的说法,我想要多次空格($ array [0]中的数字)。

感谢。

1 个答案:

答案 0 :(得分:3)

替换s///的右侧不是正则表达式模式。您不能告诉它使用模式语法创建内容。

  

无法识别的逃脱通过...

传递

此错误意味着Perl将\s解释为类似于插值字符串内的\n\r的转义序列。替换的右侧与普通双引号""字符串相同。 \s没有意义,所以Perl抱怨道。所有括号和括号将显示为文字字符。当我在答案中进一步提供数据时,这就是结果。

foo
(s){4}

相反,您必须在替换时使用/e标志,并提供Perl代码。 s///的右侧将使用实际代码进行评估,结果将用作替换。您可以使用x operator重复空格字符。请注意,整个右侧现在需要是一个有效的Perl表达式,因此您必须构造字符串并使用连接运算符.

$line =~ s/(.*?$)/"$1\n" . ( q{ } x $array[0] ) /e;

当我使用下划线而不是空格运行时,它看起来很奇怪。我不认为它做你想做的事。

my @array = ( 4 );
my $line = "foo";
$line =~ s/(.*?$)/"$1\n" . ( "_" x $array[0] ) /e;
print $line;

__END__
foo
____