我有一个脚本,除其他外,搜索文本文件列表以用另一个路径替换Windows路径(文本字符串)。
问题是某些文件夹名称以数字和短划线开头。 Perl似乎认为我试图在这里调用正则表达式。我收到消息,"在正则表达式中引用不存在的组"。
字符串如下所示:
\\\BAGlobal\6-Engineering\3-Tech
我引用了这样的话:
my $find = "\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech"
如何逃避6-
和3-
?
答案 0 :(得分:5)
问题不是6-
中的破折号,而是所有反斜杠\
。
它认为\3
和\6
是对以前匹配的群组的反向引用,例如/foo(bar) foo\1/
会匹配字符串foobar foobar
。
如果您在模式匹配中使用此功能,则需要添加\Q
和\E
来添加引用,或将quotemeta
built-in应用于$find
。
my $find = '\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech';
$string =~ m/\Q$find\E/;
或quotemeta
。
my $find = quotemeta '\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech';
$string =~ m/$find/;
另见perlre。
请注意,您的示例代码可能有误。你在那里的反斜杠数是不均匀的,并且双引号""
插值,因此每对反斜杠\\
在字符串中变成一个实际的反斜杠。但是因为你有7个,所以最后一个被视为B
的转义,将其转换为\B
,这不是有效的转义序列。我在上面的代码中使用了单引号''
。