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

时间:2015-09-14 14:20:17

标签: perl string-literals

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个反斜杠,以使其按预期工作。我错过了什么?

2 个答案:

答案 0 :(得分:9)

来自perldoc perlop

  

问/ 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";

将完全按照您键入的内容进行打印。