Envoyé par
kioka
Pas mal, je veut bien une petite explication du code ... merci.
Par contre lorsque je fait un :
print "$chaine1\n$chaine2\n"; pour voir ce qu'il advient aux chaînes il me les redonnent comme à l'origine sans changement ?! Vais re-vérifier !
Mmm... en recopiant au "propre" mon uniligne (et en adaptant les noms de variable), j'ai merdé lamentablement.
Voici le code correct, et une explication :
1 2 3 4 5 6 7
| my $chaine1 = "Bonjourvvv tous !";
my $chaine2 = "Bonjourvvv vous !";
my $chaine1_orig = $chaine1; # a conserver pour un usage futur
$chaine1 =~ s/(v+)/substr($chaine2, pos($chaine1), length($1)) eq $1 ? "" : $1/ge;
$chaine2 =~ s/(v+)/substr($chaine1_orig, pos($chaine2), length($1)) eq $1 ? "" : $1/ge; |
D'abord, je sauve $chaine1 car il sera modifié avec la première regexp.
Ensuite, chaque regexp est similaire, j'en explique donc une :
- le modificateur /ge permet d'exécuter la correspondance de motif autant de fois que nécessaire (/g), et de considérer la partie de substitution comme une expression perl
- le motif est "v+", c'est à dire le caractère v répété autant de fois que possible (au moins une fois)
- l'expression de substitution est la suivante
substr($chaine1_orig, pos($chaine2), length($1)) eq $1 ? "" : $1
où $1 est la chaine capturée (vvv dans notre cas). On remplace donc $1 par "" si cette sous-chaine $1 se trouve au même endroit dans l'autre chaine (substr($chaine2, pos($chaine1), length($1) eq $1). Sinon, on garde $1.
Partager