在Perl單個字符backslash escapes,你可以這樣做安全使用兩個字符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
輸出:
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
線s/\\([rnt'"\\])/"qq|\\$1|"/gee
做的工作。
我想不出一個兩個字符的組合,這將是一個安全漏洞...
這種方法確實不處理正確執行以下操作:
帶引號的字符串。例如,由於單引號,Perl不會忽略字符串'line 1 \ nline 2'。
逃逸序列,其比單個字符較長,如十六進制\x1b
或Unicode如\N{U+...}
或控制序列,例如\cD
錨逃逸,如\ LMAKE小寫\ E或\ Umake上案例。\ 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
處理所有的Perl escapes除了:
錨型(\ Q,\ü通過。\ E結束,\ L)
引用形式,如'don't \n escape in single quotes'
或[not \n in here]
命名爲unicode字符,如\N{THAI CHARACTER SO SO}
控制字符如\cD
(即容易加到...)
但是,這不是你的問題的一部分,因爲我的理解是......
第一次替換效果很好,謝謝! – Neo 2010-10-03 15:44:30