为什么 q/\\a/ 等于 q/\a/?
Why does q/\\a/ equal q/\a/?
以下示例打印 "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>.
Is there a need to escape a backlash in single-quoted string?
是,如果反斜杠后跟另一个反斜杠,或者是字符串中的最后一个字符:
$ perl -e'print q/C:\/'
Can't find string terminator "/" anywhere before EOF at -e line 1.
$ perl -e'print q/C:\/'
C:\
这使得在单引号字符串中包含任何字符成为可能,包括定界符和转义符。
If I wanted 2 backlashes, I'd need to specify 4; this does not seem convenient.
实际上,您只需要三个(因为第二个反斜杠后面没有跟另一个反斜杠)。但作为替代方案,如果您的字符串包含很多反斜杠,您可以使用单引号 heredoc,这不需要转义:
my $path = <<'END';
C:\a\very\long\path
END
chomp $path;
print $path; # C:\a\very\long\path
请注意,heredoc 在末尾添加了一个换行符,您可以使用 chomp
将其删除。
在单引号字符串文字中,
A backslash represents a backslash unless followed by the delimiter or another backslash, in which case the delimiter or backslash is interpolated.
换句话说,
- 您必须转义分隔符。
- 您必须转义后跟
\
或分隔符的 \
。
- 您可以转义后面没有
\
或定界符的 \
。
所以,
q/\// ⇒ /
q/\\a/ ⇒ \a
q/\\a/ ⇒ \a
q/\a/ ⇒ \a
q/\a/ ⇒ \a
Is there a need to escape a backlash in single-quoted string?
是,如果其后跟另一个反斜杠或定界符。
If I wanted 2 backlashes, I'd need to specify 4
三个就够了。
this does not seem convenient.
它比必须始终转义反斜杠的双引号字符串更方便。单引号字符串需要尽可能少的转义,而不会失去生成分隔符的能力。
以下示例打印 "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>.
Is there a need to escape a backlash in single-quoted string?
是,如果反斜杠后跟另一个反斜杠,或者是字符串中的最后一个字符:
$ perl -e'print q/C:\/'
Can't find string terminator "/" anywhere before EOF at -e line 1.
$ perl -e'print q/C:\/'
C:\
这使得在单引号字符串中包含任何字符成为可能,包括定界符和转义符。
If I wanted 2 backlashes, I'd need to specify 4; this does not seem convenient.
实际上,您只需要三个(因为第二个反斜杠后面没有跟另一个反斜杠)。但作为替代方案,如果您的字符串包含很多反斜杠,您可以使用单引号 heredoc,这不需要转义:
my $path = <<'END';
C:\a\very\long\path
END
chomp $path;
print $path; # C:\a\very\long\path
请注意,heredoc 在末尾添加了一个换行符,您可以使用 chomp
将其删除。
在单引号字符串文字中,
A backslash represents a backslash unless followed by the delimiter or another backslash, in which case the delimiter or backslash is interpolated.
换句话说,
- 您必须转义分隔符。
- 您必须转义后跟
\
或分隔符的\
。 - 您可以转义后面没有
\
或定界符的\
。
所以,
q/\// ⇒ /
q/\\a/ ⇒ \a
q/\\a/ ⇒ \a
q/\a/ ⇒ \a
q/\a/ ⇒ \a
Is there a need to escape a backlash in single-quoted string?
是,如果其后跟另一个反斜杠或定界符。
If I wanted 2 backlashes, I'd need to specify 4
三个就够了。
this does not seem convenient.
它比必须始终转义反斜杠的双引号字符串更方便。单引号字符串需要尽可能少的转义,而不会失去生成分隔符的能力。