-1

我有这个示例字符串,包含 2 个反斜杠。请不要问我字符串的来源,它只是一个示例字符串。

my $string = "use Ppppp\\Ppppp;";
print $string;

两者,双引号或引号都将打印

use Ppppp\Ppppp;

使用

my $string = "\Quse Ppppp\\Ppppp;\E";
print $string;

将打印

use\ Ppppp\\Ppppp\;

将这些额外的反斜杠添加到输出中。

perl 中是否有一个简单的解决方案来显示字符串“字面意思”,而无需修改字符串,例如添加额外的反斜杠来转义?

4

1 回答 1

3

我有这个示例字符串,包含 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;"中的其他方法之一)。

于 2019-01-22T20:17:08.633 回答