2

以下示例打印“SAME”:

if (q/\\a/ eq q/\a/) {
    print "SAME\n";
}
else {
    print "DIFFERENT\n";
}

我了解这与文档一致。但我认为这种行为是不可取的。是否需要在单引号字符串中转义反斜线?如果我想要 2 次反冲,我需要指定 4;这似乎不方便。

Perl 不应该检测反斜杠是否用作转义字符吗?例如,当反斜杠不在分隔符之前时,它应该被视为文字;如果是这样的话,我不需要 3 个反斜杠来表达两个,例如,

q<a\\b>

代替

q<a\\\b>.
4

2 回答 2

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.

于 2016-12-12T17:57:48.697 回答
10

在单引号字符串文字中,

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

换句话说,

  • 您必须转义分隔符。
  • 您必须转义\后面跟的\或分隔符。
  • 您可能会转义\后面没有\或分隔符的内容。

所以,

q/\//      ⇒   /
q/\\\\a/   ⇒   \\a
q/\\\a/    ⇒   \\a
q/\\a/     ⇒   \a
q/\a/      ⇒   \a

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

是的,如果后面跟着另一个反斜杠或分隔符。

如果我想要 2 次反弹,我需要指定 4

三个就够了。

这似乎不方便。

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

于 2016-12-12T18:05:03.627 回答