以下示例打印“SAME”:
if (q/\\a/ eq q/\a/) {
print "SAME\n";
}
else {
print "DIFFERENT\n";
}
我理解这与documentation一致。但我认为这种行为是不可取的。是否需要在单引号字符串中消除强烈反对 lilteral ?如果我想要2个反冲,我需要指定4;这似乎不方便。
Perl是否应该检测反斜杠是否作为转义字符?例如,当反斜杠不在分隔符之前时,应将其视为文字;如果是这种情况,我不需要3个反斜杠表示两个,例如
q<a\\b>
而不是
q<a\\\b>.
答案 0 :(得分:11)
是否需要在单引号字符串中消除反弹?
是的,如果反斜杠后跟另一个反斜杠,或者是字符串中的最后一个字符:
$ perl -e'print q/C:\/'
Can't find string terminator "/" anywhere before EOF at -e line 1.
$ perl -e'print q/C:\\/'
C:\
这使得可以在单引号字符串中包含任何字符,包括分隔符和转义字符。
如果我想要2个反冲,我需要指定4;这似乎不方便。
实际上,你只需要三个(因为第二个反斜杠后面跟着另一个反斜杠)。但作为替代方案,如果你的字符串包含很多反斜杠,你可以使用单引号的heredoc,这不需要转义:
my $path = <<'END';
C:\a\very\long\path
END
chomp $path;
print $path; # C:\a\very\long\path
请注意,heredoc会在最后添加换行符,您可以使用chomp
删除该换行符。
答案 1 :(得分:10)
在单引号字符串文字中,
反斜杠表示反斜杠,除非后跟分隔符或其他反斜杠,在这种情况下插入分隔符或反斜杠。
换句话说,
\
或分隔符的\
。\
之后的\
或分隔符。所以,
q/\// ⇒ /
q/\\\\a/ ⇒ \\a
q/\\\a/ ⇒ \\a
q/\\a/ ⇒ \a
q/\a/ ⇒ \a
是否需要在单引号字符串中消除反弹?
是的,如果它后跟另一个反斜杠或分隔符。
如果我想要2个反冲,我需要指定4
三个就足够了。
这似乎不方便。
比双引号字符串更方便,其中必须始终转义反斜杠。单引号字符串需要尽可能少的转义,而不会失去生成分隔符的能力。