Perl的q函数或单引号应该将字符串文字返回为typed(\'
除外)。但是对于以下场景,它无法正常工作。
我想打印以下UNC路径
\\dir1\dir2\dir3
所以我用过
my $path = q(\\dir1\dir2\dir3);
OR
my $path = '\\dir1\dir2\dir3';
但这会在前面跳过一个反斜杠。
因此,如果我打印它,print $path;
它打印
\dir1\dir2\dir3
我想知道为什么?我必须在UNC路径的开头键入3或4个反斜杠,以使其按预期工作。我错过了什么?
答案 0 :(得分:9)
问/ STRING / 强>
<强> 'STRING'强>
单引号的文字字符串。反斜杠表示反斜杠,除非后跟分隔符或另一个反斜杠,在这种情况下会对插入符或反斜杠进行插值。
变化:
my $path = q(\\dir1\dir2\dir3);
为:
my $path = q(\\\dir1\dir2\dir3);
至于为什么,这是因为Perl允许您通过使用反斜杠转义它来在字符串中包含引号分隔符:
my $single_quote = 'This is a single quote: \'';
但是如果分隔符之前的反斜杠总是转义分隔符,则无法使用反斜杠结束字符串:
my $backslash = 'This is a backslash: \'; # nope
允许反斜杠转义也可以解决这个问题:
my $backslash = 'This is a backslash: \\';
答案 1 :(得分:5)
有趣的是,只有一种方法可以在perl字符串中键入双反斜杠而不将其作为单个反斜杠进行插值。
正如所有其他答案所示,任何引用运算符都将反斜杠视为反斜杠,除非直接跟随它。
获得双反斜杠的唯一方法是使用single quote here-doc完全按照{{3}}进行显示。
my $path = <<'VISTA';
\\dir1\dir2\dir3
VISTA
chomp $path;
print $path."\n";
将完全按照您键入的内容进行打印。