如何打印包含双反斜杠\\
字符的字符串(单引号),而不会使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 :(得分: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;
}