为什么在这个Perl示例中,具有转义字符的字符串的串联工作方式不同?

时间:2011-11-02 07:55:52

标签: perl escaping

有: 我是Perl的新手,并且遇到了字符串连接问题。我有两个字符串:

my $string1 = "hello\U\Q \t\n\f\b\aWorld" . "\n" . "\E";
my $string2 = "hello\U\Q \t\n\f\b\aWorld\n\E";

它们看起来和我一样,直到我打印出来。 $string1看起来像这样:

hello\ \    \
\
 \WORLD

并带着铃声。

$string2就是这个:

hello\ \    \
\
 \WORLD\

带有相同的铃声,尾部有反斜杠。

为什么$string2在结尾处得到反斜杠,但$string1没有?

2 个答案:

答案 0 :(得分:10)

当你使用\Q时,你告诉它引用(在前面放一个反斜杠)所有与\w不匹配的字符。结果是,每当代码中出现反斜杠时,您都会添加反斜杠。例如\a会产生铃声但你的字符串会添加一个反斜杠。当你使用\Q时,它会以这种方式运行,直到你到达\E 结束字符串。

当你创建$string1时,你实际上有3个单独的字符串,你将它们一起添加,因此它们会被单独评估。结果是只有3个中的第一个受\Q影响。

在第二个示例中,\n\E会在字符串中生成\\。当你打印出来时,它会产生你看到的尾部反斜杠。

希望这是有道理的。

答案 1 :(得分:7)

因为\Q引用任何元字符(包括"\")到\E或字符串的结尾。如果您希望它们打印相同,请使用:

my $s1 = "hello\U\Q \t\n\f\b\aWorld" . "\Q\n" . "\E";

检查:

my $s2 = "hello\U\Q \t\n\f\b\aWorld\n\E";
$s1 eq $s2 && print '$s1 is equal to $s2', "\n";