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个)。
答案 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
最后一行中间有六个反斜杠,这正是我的预期。现实不同。
所以: