2013-04-23 120 views
-1

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

$str = 'a\\b'; 

输出是

a\b 

,但我需要

a\\b 

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

我试着用模板工具包和html和html_entity过滤器。它的工作原理迄今为止唯一的方法是使用一个单一这里引用文件:

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

但我不能插值的变量,这使得该解决方案毫无用处。

我试图写一个字符串到网页,文件和壳,但没有运气,总是一个反斜杠消失。也许我完全在错误的轨道上,但什么是正确的方式来打印复杂的正则表达式,包括所有组合和数字中的反斜杠,而没有任何更改?

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

+5

请举例说明你想做什么。一旦反斜杠在变量中,它们将保持不变,并且如果它们插入到字符串中,它们将正确显示。将一对反斜杠放入字符串*的唯一方法是将它们加倍,但这不应该成为问题。有几个软件层将反斜杠视为转义字符,因此您的问题可能不在Perl内。 – Borodin 2013-04-23 12:09:47

回答

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

这打印a\\b

使用 my $ str ='a \\ b'; 改为

0

这是一个PITA,但您只需要将反斜杠加倍即可

a\\\\b 

否则,您可以将反斜杠存储在另一个变量中,然后对其进行插值。

1

最小得到两条斜线是(不幸)三个斜杠:

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

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

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

这将打印a\\b

编辑:

您可以使用插值来代替:

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

这仍然打印a\\b

+1

谢谢,但只适用于你在字符串中加了反斜杠的情况。如果你有一个额外的单反斜杠,它会在输出中翻倍。 – Norbert 2013-04-23 12:53:14

+0

确实,确实...... – 2013-04-23 14:16:51

1

当在Perl源代码,例如它发生反斜杠只有意义的Perl:你的文字字符串赋值给一个变量:

my $str = 'a\\b'; 

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

+1

是的,确切地说。有时候明显的事情需要时间来理解。现在一切都很清楚。谢谢。 – Norbert 2013-04-24 09:45:07

1

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