2

Perl 中有没有办法在字符串变量中保留和打印所有反斜杠?例如:

$str = 'a\\b';

输出是

a\b

但是我需要

a\\b

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

我尝试使用模板工具包以及 html 和 html_entity 过滤器。到目前为止,唯一可行的方法是使用单引号此处的文档:

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

但是我不能插入变量,这使得这个解决方案毫无用处。

我试图将字符串写入网页、文件和外壳,但没有运气,总是一个反斜杠消失。也许我完全走错了路,但是打印复杂正则表达式的正确方法是什么,包括所有组合和数字中的反斜杠而不做任何更改?

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

4

7 回答 7

3

反斜杠仅在 Perl 源代码中出现时才对 Perl 有意义,例如:将文字字符串分配给变量:

my $str = 'a\\b';

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

于 2013-04-23T21:09:37.837 回答
2
my $str = 'a\\b';
print $str;

这打印a\\b

使用我的 $str = 'a\\\\b'; 反而

于 2013-04-23T11:59:22.597 回答
1

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

于 2013-04-24T06:37:45.753 回答
1

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

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

这打印a\\b

编辑:

您可以使用非插值 here-document 代替:

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

这仍然打印a\\b

于 2013-04-23T12:23:23.573 回答
1

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

 a\\\\b

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

于 2013-04-23T12:00:27.610 回答
1

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

use 5.016;
my $a = 'a\\\b';
say $a;
于 2013-04-23T12:13:17.093 回答
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

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

所以:

  • "in here \" 被插值
  • 在 HEREDOC \ 被插值
  • 'in single quotes only \' 被插值并且仅用于 \ 和 ' (还有更多吗?)
  • 我的 $str = '同样有限\插值';
  • perl.pl 'escape using bash rules' with @ARGV 未插值
于 2018-08-05T17:11:24.973 回答