Salut,
#!/usr/bin/perl
use warnings;use strict;
my $var='je viens / de me mettre / à la programmation / Perl';
(my $res = $var) =~ s/\/([^\/]*)$//g; # preserve le contenu de $var
print "Substitution : $res\n";
print "Entre paranthèses : $1\n";
print "Le contenu de la variable \$var est préservé.\n\$var = $var\n";
__END__
l'opérateur s/// contient 2 parties : le motif et le remplacement
le motif
\/([^\/]*)$
\/ - reconnaît un slash
[^\/] - reconnaît tout caractère qui n'est pas slash
* - reconnait la classe complementé [^\/] zero fois, une fois, autant de fois qu'il peut
$ - reconnaît la fin d'une chaine (le caractère de fin de chaîne n'est pas reconnu)
les paranthèses capturent le contenu de la reconnaissance qu'on le trouve dans la variable $1
Dans la classe de caractères complémentée [^\/] on est obligé d'utiliser l'antislash, sinon perl va croire que s/// sera fini trop tôt et
il va lever une exception (message d'erreur). Pareil pour le 1er slash.
Le remplacement s'exécute une seule fois.
Pour remplacer tout il faut utiliser le modificateur /g
En ce cas le résultat sera : je viens
Voilà une traduction de la regex
Reconnaît dans la chaine contenu par la variable $var
un motif qui commence avec un slash, il es suit de n'importe quel
caractère qui n'est pas slash, zero fois, une fois ou n'importe combien de fois,
entre temps capture dans $1 la reconnaissance mais sans le slash de début,
jusqu'à la fin de la chaine et remplace avec rien.
La nouvelle chaine est sauvegardée dans $res, le contenu de la variable initiale ne change pas.
Il y a beaucoup, beaucoup des choses à dire que sur cette regex.
Les quantificateurs et leur gurmandise, les classes de caractères et les classes de caractères complémentées
le métacaractère antislash, l'ancrage, les modificateurs de s///
J'espère que j'ai pu t'aider un peu.
Une petite précision : $ je l'ai mis en dehors de paranthèses.
Pourquoi?
Les paranthèses ont le rôle de regroupement et la capture.
En ce cas n'est pas nécessaire pour $.
$ c'est une assertion de largeur nulle qui indique une position dans la chaîne (la fin)
mais ne consomme pas de texte.
A savoir que le comportement de $ difère si on utilise les modificateurs m ou s
/m - reconnaît ^ et $ à côté d'un \n interieur
/s - fait correspondre . avec le saut de ligne
lami20j