2017-02-19 185 views
3

如何才能打印包含双反斜杠\\字符的字符串(单引号),而无需使Perl以某种方式将其插入单斜杠\?我不想通过添加更多转义字符来更改字符串。如何防止Perl将双反斜杠解释为单反斜杠字符?

my $string1 = 'a\\\b'; 
print $string1; #prints 'a\b' 

my $string1 = 'a\\\\b'; 
    #I know I can alter the string to escape each backslash 
    #but I want to keep string as is. 
print $string1; #prints 'a\\b' 

#I can also use single-quoted here document 
#but unfortunately this would make my code syntactically look horrible. 
my $string1 = <<'EOF'; 
a\\b 
EOF 
print $string1; #prints a\\b, with newline that could be removed with chomp 
+0

让我猜...处理Windows文件路径? – Schwern

+0

不,我将单引号字符串传递给子例程,这些字符串包含双反斜线。 – Omar

+0

哦。你能举个例子吗?您不应该在单引号内部使用双引号。 “她说,”你不必在单引号中双引号。“”没关系。所以如果你想要插值但是不想用双引号来使用'qq []'。 – Schwern

回答

9

唯一引用构建的Perl不解释反斜杠在所有的单引号here文档:

my $string1 = <<'EOF'; 
a\\\b 
EOF 
print $string1; # Prints a\\\b, with newline 

因为在这里,文档是基于行的,这是不可避免的,你会在字符串末尾换行,但可以用chomp删除它。

其他技术就是简单地与它一起生活,并正确反斜线(对于少量数据),或将它们放入__DATA__部分或外部文件(对于大量数据)。

+1

我不知道! – Schwern

+0

单引号这里的文件解决方案对每个字符串我会让我的代码在语法上看起来很可怕。 – Omar

+0

@奥玛,我只是在陈述事实。您可以反斜杠反斜杠,可以使用heredocs,也可以将这些路径保存在Perl源文件以外的某处。据我所知,没有任何其他合理的选择,所以选择一个你不喜欢的人:) – hobbs

0

由于反斜杠内插发生在字符串文字中,因此也许您可以使用其他任意符号声明您的文字,然后将它们替换为其他内容。

my $string = 'a!!!b'; 
$string =~ s{!}{\\}g; 
print $string; #prints 'a\\\b' 

当然它并没有成为!,不以字符串会做一个正常的角色冲突的任何符号。你说你需要做一些字符串,所以你可以把替代的功能

sub bs { 
    $_[0] =~ s{!}{\\}gr 
} 

my $string = 'a!!!b'; 
print bs($string); #prints 'a\\\b' 

附: 该功能使用v5.14中介绍的非破坏性替代修饰符/r。如果您使用的是旧版本,则该函数将需要这样写

sub bs { 
    $_[0] =~ s{!}{\\}g; 
    return $_[0]; 
} 

或者,如果你喜欢的东西更具可读性

sub bs { 
    my $str = shift; 
    $str =~ s{!}{\\}g; 
    return $str; 
} 
6

如果你是有些疯狂,而像的想法使用实验性软件,利用perl的内部机制来改善代码的美感,您可以在今天上午使用CPAN上的Syntax::Keyword::RawQuote模块。

use syntax 'raw_quote'; 
my $string1 = r'a\\\b'; 
print $string1; # prints 'a\\\b' 

感谢@melpomene的灵感。

+0

这很鼓舞人心。 – zdim