Perl与反斜杠不匹配

时间:2013-01-31 15:31:41

标签: regex perl backslash

  

可能重复:
  Text replacement with backslash in a variable in Perl

为什么这段代码不起作用?

my $foo = '\aa\bb';
my $bar = '\aa\bb\ee\ss.txt';

say $bar =~ m/^$foo.*$/ ? 'OK' : 'BAD';

使用正斜杠就可以了。

3 个答案:

答案 0 :(得分:6)

在将正则表达式放在那里之前,您应该首先使用 quotemeta

my $foo = quotemeta('\aa\bb');

放入正则表达式时的反斜杠,带有特殊含义。 quotemeta将逃脱它们,以便按字面意思匹配它们。

答案 1 :(得分:4)

你必须引用特殊字符

使用它:

say $bar =~ m/^\Q$foo\E.*$/ ? 'OK' : 'BAD';
             __^    __^

查看quotemeta

答案 2 :(得分:2)

您正在使用

/^\aa\bb.*$/
  • \a匹配“闹钟”字符。
  • \b匹配字边界。

您希望生成与给定字符串匹配的模式。为此,您可以使用quotemeta

my $pat = quotemeta($foo);
/^$pat.*$/

quotemeta也可以使用\Q..\E调用。

/^\Q$pat\E.*$/