Rechercher : dans
Par :

Substitution en perl

Dernière réponse le 16 oct 2006 à 10:32:15 herve70, le 12 oct 2006 à 15:17:59 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « substitution en perl » dans :
Sed - Substitution VoirSubstitution Substitution basique Simple Globale Ciblée Substitution conditionnée Simplee Avancée Bloc Avancéé Substitution basique Simple - 1ère occurrence (de chaque ligne) rencontrée uniquement sed 's/la/LA/' fichier.txt
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Les variables avec Perl VoirConcept de variable avec Perl Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Perl peuvent être de trois...
Perl - Caractéristiques du langage VoirFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa...

1

lami20j, le 12 oct 2006 à 19:53:13

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

Répondre à lami20j

2

herve70, le 16 oct 2006 à 09:47:31

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?

Répondre à herve70

3

 lami20j, le 16 oct 2006 à 10:32:15

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

Répondre à lami20j
Collection CommentÇaMarche.net