我有这个示例字符串,包含 2 个反斜杠。...
my $string = "use Ppppp\\Ppppp;";
抱歉,但您弄错了 - 该字符串仅包含一个反斜杠*,\\
双引号(和单引号)字符串中的转义序列会产生一个反斜杠。另请参阅perlop 中的“引用和类似引用的运算符”。如果您的字符串确实包含两个反斜杠,那么您需要编写"use Ppppp\\\\Ppppp;"
或使用 heredoc,如下所示:
chomp( my $string = <<'ENDSTR' );
use Ppppp\\Ppppp;
ENDSTR
如果您希望将字符串输出作为有效的 Perl 源代码(使用其转义),那么您可以使用以下选项之一:
my $string = "use Ppppp\\Ppppp;";
# option 1
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
print Dumper($string);
# option 2
use Data::Dump;
dd $string;
# option 3
use B;
print B::perlstring($string);
这些中的每一个都将打印"use Ppppp\\Ppppp;"
. (当然还有其他可用的模块。我个人喜欢Data::Dump
.Data::Dumper
是一个核心模块。)
使用这些模块之一也是验证$string
变量真正包含的内容的最佳方式。
如果这仍然不符合您的需求:您问题的先前编辑说“我怎样才能正确转义所有特殊字符,包括反斜杠?” - 您必须指定您认为特殊的字符的完整列表。你可以做这样的事情,例如:
use 5.014; # for s///r
my $string = "use Ppppp\\Ppppp;";
print $string=~s/(?=[\\])/\\/gr;
这将打印$string
加倍的反斜杠,而无需修改$string
. 您还可以向正则表达式字符类添加更多字符,以便在这些字符前面添加反斜杠。
*更新:所以我在这里听起来不太迂腐:当然 Perl 源代码包含两个反斜杠。但是文字源代码和 Perl 字符串最终包含的内容之间存在差异,就像字符串"Foo\nBar"
包含换行符而不是两个文字字符\
和n
.
为了完整起见,正如评论中已经讨论的那样:\Q\E
(aka quotemeta
) 主要用于转义任何可能对正则表达式特殊的特殊字符(所有 ASCII 字符不匹配/[A-Za-z_0-9]/
),这就是为什么它也转义空格和分号.
由于您提到了外部文件:如果您正在读取诸如use Ppppp\\Ppppp;
从外部文件中读取的行,那么 Perl 字符串将包含两个反斜杠,如果您print
这样做,它还将显示两个反斜杠。但是,如果您想将该字符串表示为 Perl 源代码,则必须编写(或使用您链接到的问题"use Ppppp\\\\Ppppp;"
中的其他方法之一)。