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

do.*_*do. 2 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";
Run Code Online (Sandbox Code Playgroud)

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

hello\ \    \
\
 \WORLD
Run Code Online (Sandbox Code Playgroud)

和一个铃声.

$string2 就是这个:

hello\ \    \
\
 \WORLD\
Run Code Online (Sandbox Code Playgroud)

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

为什么$string2在结尾处得到反斜杠但$string1不是?

Nic*_*ick 10

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

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

在第二个示例中,\n\E结果在\\字符串中.当你打印出来时,它会导致你看到的尾随反斜杠.

希望有道理.


Eug*_*ash 7

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

my $s1 = "hello\U\Q \t\n\f\b\aWorld" . "\Q\n" . "\E";
Run Code Online (Sandbox Code Playgroud)

去检查:

my $s2 = "hello\U\Q \t\n\f\b\aWorld\n\E";
$s1 eq $s2 && print '$s1 is equal to $s2', "\n";
Run Code Online (Sandbox Code Playgroud)