Perl q函数或单引号不能正确返回UNC路径的字符串文字

ont*_*cks 4 perl string-literals

Perl的q函数或单引号应该将字符串文字返回为typed(除外\').但是对于以下场景,它无法正常工作.我想打印以下UNC路径

\\dir1\dir2\dir3
Run Code Online (Sandbox Code Playgroud)

所以我用过

my $path = q(\\dir1\dir2\dir3); 
Run Code Online (Sandbox Code Playgroud)

要么

my $path = '\\dir1\dir2\dir3'; 
Run Code Online (Sandbox Code Playgroud)

但这会在前面跳过一个反斜杠.所以,如果我打印它,即print $path;它打印

\dir1\dir2\dir3
Run Code Online (Sandbox Code Playgroud)

我想知道为什么?我必须在UNC路径的开头键入3或4个反斜杠,以使其按预期工作.我错过了什么?

Thi*_*Not 9

来自perldoc perlop:

Q/STRING /

'串'

单引号的文字字符串.反斜杠表示反斜杠,除非后跟分隔符或另一个反斜杠,在这种情况下,插入分隔符或反斜杠.

更改:

my $path = q(\\dir1\dir2\dir3);
Run Code Online (Sandbox Code Playgroud)

至:

my $path = q(\\\dir1\dir2\dir3);
Run Code Online (Sandbox Code Playgroud)

至于为什么,这是因为Perl允许您通过使用反斜杠转义它来在字符串中包含引号分隔符:

my $single_quote = 'This is a single quote: \'';
Run Code Online (Sandbox Code Playgroud)

但是,如果分隔符之前的反斜杠始终转义分隔符,则无法使用反斜杠结束字符串:

my $backslash = 'This is a backslash: \'; # nope
Run Code Online (Sandbox Code Playgroud)

允许反斜杠转义也可以解决这个问题:

my $backslash = 'This is a backslash: \\';
Run Code Online (Sandbox Code Playgroud)


Tre*_*ama 5

有趣的是,只有一种方法可以在perl字符串中键入双反斜杠而不将其作为单个反斜杠进行插值.
正如所有其他答案所示,任何引用运算符都将反斜杠视为反斜杠,除非直接跟随它.

获得双反斜杠的唯一方法就是在输入时使用单引号 - doc.

my $path = <<'VISTA';  
\\dir1\dir2\dir3 
VISTA
chomp $path;
print $path."\n";
Run Code Online (Sandbox Code Playgroud)

会像你输入的那样完全打印出来.