保留Perl字符串中的反斜杠

时间:2013-04-23 11:56:51

标签: perl backslash preserve

Perl中是否有一种方法可以保存和打印字符串变量中的所有反斜杠? 例如:

$str = 'a\\b';

输出

a\b

但我需要

a\\b

问题是无法以任何方式处理字符串以逃避反斜杠,因为 我必须从数据库中读取复杂的正则表达式,并且不知道它们出现在哪个组合和数字中,并且必须完全按照它们在网页上打印它们。

我尝试使用模板工具包和html以及html_entity过滤器。它到目前为止唯一的工作方式是使用单引号文档:

print <<'XYZ';
a\\b
XYZ

但是我无法插入使这个解决方案变得无用的变量。

我试着将一个字符串写入一个网页,一个文件和一个shell,但没有运气,总是一个反斜杠消失。也许我完全走错了轨道,但是在没有任何改变的情况下,打印复杂正则表达式(包括所有组合和数字中的反斜杠)的正确方法是什么?

换句话说: 我有一个包含数百个正则表达式作为字符串数据的数据库。我想用perl读取它们并将它们打印在网页上,因为它们在数据库中。 许多管理员对这些正则表达式进行了所有时间的更改,因此我事先并不知道如何以及如何逃避。 一个典型的例子如下: 'C:\\test\\file \S+' 但它可能会在第二天改变 '\S+ C:\\test\\file' 也许一个正确的结论是,无论在哪个组合中出现每个反斜杠,以及它出现在哪个数字中?这意味着它可以使它们加倍。那问题并不像我担心的那么大。我在bash上测试它,它连续使用两个甚至三个反斜杠(4个背板打印2个,6个反斜杠打印3个)。

7 个答案:

答案 0 :(得分:2)

my $str = 'a\\b';
print $str;

这会打印a\\b

使用 我的$ str ='a \\ b'; 代替

答案 1 :(得分:2)

反斜杠只有在Perl源代码中出现时才对Perl有意义,例如:你将一个文字字符串赋值给变量:

my $str = 'a\\b';

但是,如果您从文件(或数据库或套接字等)读取数据,则您保存的数据中的任何反斜杠都将被保留,而无需您执行任何特殊步骤。

答案 2 :(得分:1)

它是一个PITA,但你只需加倍反斜杠,例如

 a\\\\b

否则,您可以将反斜杠存储在另一个变量中,并插入该变量。

答案 3 :(得分:1)

获得两个斜杠的最小值(不幸的是)有三个斜杠:

use 5.016;
my $a = 'a\\\b';
say $a;

答案 4 :(得分:1)

我试图解决的问题不存在。我混淆使用html表单直接在代码中初始化字符串。在代码中使用保留所有反斜杠的字符串只能通过here文档或通过读取包含该字符串的文本文件来实现。但是,如果我只是在网页上使用html表单插入一个字符串并使用CGI模块中的escapeHTML()来处理所有内容,您可以插入最有线的特殊字符组合。它们都完全按照插入的方式显示和保存。所以我应该直接使用html和数据库操作,而不是先尝试检查事物 通过在代码中直接使用字符串。无论如何,谢谢你的帮助。

答案 5 :(得分:0)

您可以使用以下正则表达式正确形成字符串:

my $str = 'a\\b';
$str =~ s/\\/\\\\/g;
print "$str\n";

这会打印a\\b

修改

您可以使用插值代替:

my $str = <<'EOF';
a\\b
EOF
print "$str\n";

仍会打印a\\b

答案 6 :(得分:0)

格兰特的回答提供了我需要的提示。其他一些答案与我系统上的Perl操作不匹配,所以...

#!/usr/bin/perl
use warnings;
use strict;

my $var = 'content';

print "\'\"\N{U+0050}\\\\\\$var\n";

print <<END;
\'\"\N{U+0050}\\\\\\$var\n
END

print '\'\"\N{U+0050}\\\\\\$var\n'.$/;

my $str = '\'\"\N{U+0050}\\\\\\$var\n';
print $str.$/;

print @ARGV;
print $/;

从bash调用...使用bash方式将转义符\更改为'\''。

jamie@debian:~$ ./ft.pl '\'\''\"\N{U+0050}\\\\\\$var\n'
'"P\\\content
'"P\\\content

'\"\N{U+0050}\\\$var\n
'\"\N{U+0050}\\\$var\n
\'\"\N{U+0050}\\\\\\$var\n

最后一行中间有六个反斜杠,这正是我的预期。现实不同。

所以:

  • 插入“在这里\”
  • 在HEREDOC \中被插值
  • 仅对单引号\进行插补,仅对\和'(还有吗?)
  • 我的$ str ='相同限制\插值';
  • 未插入带有 @ARGV的
  • perl.pl“使用bash规则转义”