[Perl] Problème regexp en Perl

Marc Chantreux khatar at phear.org
Mar 19 Sep 21:54:06 CEST 2017


salut Dominique,

> my $text = "+abcd";
> if( $text =~ m/\+/ ) {
>   $text =~ s/$&//;
> }
> print( $text.$/ );

pourquoi chercher le motif une premiere fois ? si c'est parceque tu veux
faire qqchose quand la substitution a lieu, tu peux simplement compter
sur le fait qu'elle renvoie un booléen

for ( "+abcd ) { say "substitution il y a" if s/^\+// }

ensuite ... utiliser $& dans une substitution (donc avec une
regexp) en esperant que $& est bien l'ancien $& ... si tu vois le pb? 

> Bien évidemment il serait facile d'écrire la chose autrement mais ici
> c'est un ECM comme on dit et dans mon cas la regexp est évidemment
> plus complexe.

ben si tu nous montres, on aura pe de meilleures approches à te propser.

> Comment faire en sorte que le contenu de $& soit pris comme tel et non comme une regexp ?

dans une regexp, tu peux faire du litteral entre un \Q et un \E donc 
pour rester proche de ton exemple:

my $text = "+abcd";
my ($matched) = $text =~ /(\+)/;
length $matched and  $text =~ s/\Q$$matched//;
print $text;

une autre approche serait de se servir de //g pour positionner le
curseur sur ta chaine. tu peux alors te déplacer petit à petit:

use v5.24;
my $text = "+abcd";
$text =~ /(\+)/g;

say "
    matched: '$1'
    current position: ${\(pos $text )}
    remaining text :  ${\(substr $text, (pos $text) )}
";

cordialement,
marc

-- 
Marc Chantreux (eiro on github and freenode)
http://eiro.github.com/
http://eiro.github.com/atom.xml
"Don't believe everything you read on the Internet"
    -- Abraham Lincoln


Plus d'informations sur la liste de diffusion Perl