Substitution en perl

Résolu/Fermé
herve70 - 12 oct. 2006 à 15:17
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 16 oct. 2006 à 10:32
bonjour,

je viens de me mettre a la programmation perl mais arrivé au substitution ben je seche (au depart c simple puis ca ce complique entre les parenthese qui fon ou non parties du motif, le crochet etc...

du coup je vois pas ce que peut me donner cette substitution :

s/\/([^\/]*$)//;

en fait je vois pas si je dois remplacer le motif par la chaine suivante ([^\/]*$)/ ou si je dois interpréter la chaine.

que cela fait il exactement?

merci
A voir également:

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 oct. 2006 à 19:53
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
2
salut,

Merci pour ton aide, c'était tout a fait clair.

encore merci

je peut a l avenir si j ai de nouvelles intérrogations sur perl solliciter ton aide?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
16 oct. 2006 à 10:32
Salut,

je peut a l avenir si j ai de nouvelles intérrogations sur perl solliciter ton aide?

Tu peux toujours demandé de l’aide à la communauté CCM.
Si c’est moi le 1er qui vois le message je vais essayer de répondre bien sûr ;)


lami20j
0