Pour Perl caractère unique backslash escapes, vous pouvez le faire en toute sécurité en utilisant un eval
à deux caractères dans le cadre de la substitution. Vous devez mettre dans les caractères qui sont acceptables à interpréter dans la classe de caractères après le \
, puis le caractère unique après est eval
'd et inséré dans la chaîne.
Tenir compte:
#!/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
Sortie:
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
La ligne s/\\([rnt'"\\])/"qq|\\$1|"/gee
fait le travail.
Le \\([rnt'"\\])
possède les caractères acceptables pour l'évaluation à l'intérieur des accolades.
La partie gee
fait un double eval sur la chaîne de remplacement. La partie "qq|\\$1|"
est évaluée deux fois. Le premier eval
remplace $1
dans la chaîne, et le second effectue l'interpolation.
Je ne peux pas penser à une combinaison de deux caractères ici qui constituerait une faille de sécurité ...
Cette méthode ne pas accord avec ce qui suit correctement:
Les chaînes entre guillemets. Par exemple, Perl n'échapperait pas à la chaîne 'ligne 1 \ ligne 2' à cause des guillemets simples.
séquences Escapes qui sont plus longs qu'un seul caractère, comme hex \x1b
ou Unicode comme \N{U+...}
ou des séquences de contrôle telles que \cD
échappe au mouillage, tels que \ L Se LOWER CASE \ E ou \ Umake supérieure cas \ E
Si vous voulez échapper plus complète de remplacement, vous pouvez utiliser cette regex:
#!/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
qui gère toutes Perl escapes sauf:
type fixé (\ Q, \ u, \ L se terminant par \ E)
formes cotés, comme 'don't \n escape in single quotes'
ou [not \n in here]
caractères Unicode nommés, tels que \N{THAI CHARACTER SO SO}
Les caractères de contrôle comme \cD
(que est facilement ajouté ...)
Mais ce ne faisait pas partie de votre question, je l'ai compris ...
Ce premier remplacement a bien fonctionné, merci! – Neo