如何防止Perl将双反斜杠解释为单反斜杠字符?

时间:2017-02-19 19:13:41

标签: 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

3 个答案:

答案 0 :(得分:10)

Perl中唯一没有解释反斜杠的引用构造是这里单引号文档:

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

由于here-docs是基于行的,因此您不可避免地会在字符串末尾添加换行符,但可以使用chomp将其删除。

其他技术只是简单地使用它并正确地反斜杠(对于少量数据),或者将它们放在__DATA__部分或外部文件中(对于大量数据)。

答案 1 :(得分:7)

如果你有点疯狂,并且喜欢使用实验软件来改善代码的美观,那么你可以在今天上午的CPAN上使用Syntax::Keyword::RawQuote模块。

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

感谢@melpomene的灵感。

答案 2 :(得分: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'

<强> P.S。 该函数使用/r中引入的非破坏性替换修饰符v5.14。如果您使用的是旧版本,那么该函数需要像这样编写

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

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

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