有: 我是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
没有?
答案 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";