为什么q/\\ a /等于q /\a /?

Ltf*_*4an 2 perl backslash single-quotes

以下示例打印"SAME":

if (q/\\a/ eq q/\a/) {
    print "SAME\n";
}
else {
    print "DIFFERENT\n";
}
Run Code Online (Sandbox Code Playgroud)

我理解这与文档一致.但我认为这种行为是不可取的.是否需要在单引号字符串中逃避反弹lilteral?如果我想要2个反冲,我需要指定4; 这似乎不方便.

Perl不应该检测反斜杠是否作为转义字符?例如,当反斜杠不在分隔符之前时,应将其视为文字; 如果是这种情况,我不需要3个反斜杠表示两个,例如,

q<a\\b>
Run Code Online (Sandbox Code Playgroud)

代替

q<a\\\b>.
Run Code Online (Sandbox Code Playgroud)

Thi*_*Not 11

是否需要逃避单引号字符串中的反弹?

是的,如果反斜杠后跟另一个反斜杠,或者是字符串中的最后一个字符:

$ perl -e'print q/C:\/'
Can't find string terminator "/" anywhere before EOF at -e line 1.
$ perl -e'print q/C:\\/'
C:\
Run Code Online (Sandbox Code Playgroud)

这使得可以在单引号字符串中包含任何字符,包括分隔符和转义字符.


如果我想要2个反冲,我需要指定4; 这似乎不方便.

实际上,你只需要三个(因为第二个反斜杠后面没有另一个反斜杠).但作为替代方案,如果您的字符串包含大量反斜杠,则可以使用单引号的heredoc,这不需要转义:

my $path = <<'END';
C:\a\very\long\path
END

chomp $path;
print $path; # C:\a\very\long\path
Run Code Online (Sandbox Code Playgroud)

请注意,heredoc会在末尾添加换行符,您可以将其删除chomp.


ike*_*ami 10

在单引号字符串文字中,

反斜杠表示反斜杠,除非后跟分隔符或另一个反斜杠,在这种情况下,插入分隔符或反斜杠.

换一种说法,

  • 你必须逃脱分隔符.
  • 您必须转义\后面跟着\或分隔符.
  • 您可以逃避\未遵循\的分隔符或分隔符.

所以,

q/\//      ?   /
q/\\\\a/   ?   \\a
q/\\\a/    ?   \\a
q/\\a/     ?   \a
q/\a/      ?   \a
Run Code Online (Sandbox Code Playgroud)

是否需要逃避单引号字符串中的反弹?

是的,如果它后跟另一个反斜杠或分隔符.

如果我想要2个反冲,我需要指定4

三个就足够了.

这似乎不方便.

它比双引号字符串更方便,其中必须始终转义反斜杠.单引号字符串需要尽可能少的转义,而不会失去生成分隔符的能力.