可能重复:
如何在Perl字符串中手动插入字符串转义?
我正在读取特定文件中的字符串.它的问题是它包含转义字符,如:
Hello!\nI\'d like to tell you a little \"secret\"...
Run Code Online (Sandbox Code Playgroud)
我希望它没有转义序列打印出来,例如:
Hello!
I'd like to tell you a little "secret".
Run Code Online (Sandbox Code Playgroud)
我想删除单个反斜杠并用单个替换double(因为\表示为\\),但这对我没有帮助\n,\ t问题等等.在试图摆弄丑陋,复杂的替换字符串之前,我想我会问 - 也许Perl有这种转换的内置机制?
对于 Perl 单字符反斜杠转义,您可以使用两个字符eval作为替换的一部分来安全地完成此操作。您需要在 后面放入字符类中可接受解释的字符\,然后将后面的单个字符eval'd 插入到字符串中。
考虑:
#!/usr/bin/perl
use warnings;
use strict;
print "\n\n\n\n";
while (my $data = <DATA>) {
$data=~s/\\([rnt'"\\])/"qq|\\$1|"/gee;
print $data;
}
__DATA__
Hello!\nI\'d like to tell you a little \"secret\".
A backslask:\\
Tab'\t'stop
line 1\rline 2 (on Unix, "line 1" will get overwritten)
line 3\\nline 4 (should result in "line 3\\nline 4")
line 5\r\nline 6
Run Code Online (Sandbox Code Playgroud)
输出:
Hello!
I'd like to tell you a little "secret".
A backslask:\
Tab' 'stop
line 2 (on Unix, "line 1" will get overwritten)
line 3\nline 4 (should result in "line 3\nline 4")
line 5
line 6
Run Code Online (Sandbox Code Playgroud)
线路s/\\([rnt'"\\])/"qq|\\$1|"/gee完成工作。
在大括号内有\\([rnt'"\\])可接受的字符进行评估。
该gee部分对替换字符串进行双重评估。
该"qq|\\$1|"部分被评估两次。第一个eval替换$1为字符串,第二个执行插值。
我想不出这里的两个字符组合会构成安全漏洞......
此方法不能正确处理以下情况:
带引号的字符串。例如,Perl 不会因为单引号而对字符串 'line 1\nline 2' 进行转义。
转义比单个字符长的序列,例如十六进制\x1b或 Unicode\N{U+...}或控制序列,例如\cD
锚定转义,例如 \LMAKE LOWER CASE\E 或 \Umake upper case\E
如果你想要更完整的转义替换,你可以使用这个正则表达式:
#!/usr/bin/perl
use warnings;
use strict;
print "\n\n\n\n";
binmode STDOUT, ":utf8";
while (my $data = <DATA>) {
$data=~s/\\(
(?:[arnt'"\\]) | # Single char escapes
(?:[ul].) | # uc or lc next char
(?:x[0-9a-fA-F]{2}) | # 2 digit hex escape
(?:x\{[0-9a-fA-F]+\}) | # more than 2 digit hex
(?:\d{2,3}) | # octal
(?:N\{U\+[0-9a-fA-F]{2,4}\}) # unicode by hex
)/"qq|\\$1|"/geex;
print $data;
}
__DATA__
Hello!\nI\'d like to tell you a little \"secret\".
Here is octal: \120
Here is UNICODE: \N{U+0041} and \N{U+41} and \N{U+263D}
Here is a little hex:\x50 \x5fa \x{5fa} \x{263B}
lower case next char \lU \lA
upper case next char \ua \uu
A backslask:\\
Tab'\t'stop
line 1\rline 2 (on Unix, "line 1" will get overwritten)
line 3\\nline 4 (should result in "line 3\\nline 4")
line 5\r\nline 6
Run Code Online (Sandbox Code Playgroud)
它处理所有 Perl转义,除了:
锚定类型(\Q、\U、\L 以 \E 结尾)
引用形式,例如'don't \n escape in single quotes'或[not \n in here]
命名的 unicode 字符,例如\N{THAI CHARACTER SO SO}
控制字符如\cD(很容易添加...)
但据我了解,这不是你问题的一部分......