Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

opérateur "=~"

4 réponses
Avatar
Thomas vO
bonjour,

je m'aperçois que je comprends pas bien ce que fait "=~", en
particulier sur l'exemple ci-dessous, et la lecture de perlop ne
m'aide pas beaucoup...

# attention, sur une seule ligne...
perl -e '$s="ThomasvO";$c=$s;$s=~"\L$s\E";$c="\L$c\E";$i="nok";$i="ok"
if ($c eq $s);print "$s - $c - $i\n";'

je ne comprends pas pourquoi $s et $c sont différents... pour moi,
j'étais censé avoir soit le même résultat, soit 1||0 dans $s, suivant
si la chaîne originale est en "lower-case"...

merci,

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>

4 réponses

Avatar
Paul Gaborit
À (at) Fri, 15 May 2009 10:06:39 +0200,
Thomas vO <vanouden+ écrivait (wrote):
je m'aperçois que je comprends pas bien ce que fait "=~", en
particulier sur l'exemple ci-dessous, et la lecture de perlop ne
m'aide pas beaucoup...

# attention, sur une seule ligne...
perl -e '$s="ThomasvO";$c=$s;$s=~"L$sE";$c="L$cE";$i="nok";$i="ok"
if ($c eq $s);print "$s - $c - $in";'

je ne comprends pas pourquoi $s et $c sont différents... pour moi,
j'étais censé avoir soit le même résultat, soit 1||0 dans $s, suivant
si la chaîne originale est en "lower-case"...



L'opérateur =~ n'est pas une *affectation*. Il sert juste à choisir
sur quelle chaîne de caractère on applique une opération de recherche,
substitution ou translittération.

Ce qui est à droite de =~ contient l'opération à effectuer (m/.../,
s/.../.../ ou tr/.../). Si aucune de ces trois opérations n'est
précisée, c'est une recherche qui est effectuée.

Ce qui est à gauche de =~ indique sur quelle chaîne doit s'effectuer
l'opération ci-dessus.


Donc lorsque tu écris :

$s = "abcde12":
$s=~"L$sE";

c'est équivalent à :

$s =~ m/Labcde12E/;

Il y a donc recherche du motif Labcde12E dans $s. Le résultat de cette
recherche est perdu (puisque tu ne récupères pas le résultat de
l'opérateur =~). Et $s n'est pas modifié.


--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Thomas vO
salut Paul,

À (at) Fri, 15 May 2009 10:45:07 +0200,
Paul Gaborit nous disait (told us):
Donc lorsque tu écris :

$s = "abcde12":
$s=~"L$sE";

c'est équivalent à :

$s =~ m/Labcde12E/;

Il y a donc recherche du motif Labcde12E dans $s. Le résultat de cette
recherche est perdu (puisque tu ne récupères pas le résultat de
l'opérateur =~). Et $s n'est pas modifié.



merci. du coup, peut-on récupérer le résultat de =~ ? j'imagine que
oui, vu que le test
if ($s =~ m/Labcde12E/)
va donner quelque-chose...

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>
Avatar
Paul Gaborit
À (at) Fri, 15 May 2009 11:09:20 +0200,
Thomas vO <vanouden+ écrivait (wrote):
merci. du coup, peut-on récupérer le résultat de =~ ? j'imagine que
oui, vu que le test
if ($s =~ m/Labcde12E/)
va donner quelque-chose...



Bien sûr qu'on peut récupérer le résultat de l'opérateur =~ (comme de
n'importe quel autre opérateur d'ailleurs).

Pour =~, le résultat sera celui de l'opération appliquée. Dans
l'exemple ci-dessus, c'est donc le résultat de m/.../ qui change de
nature selon qu'on est dans un contexte scalaire ou dans un contexte
de liste et selon les modificateurs appliqués...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
espie
In article ,
Thomas vO <vanouden+ wrote:
salut Paul,

À (at) Fri, 15 May 2009 10:45:07 +0200,
Paul Gaborit nous disait (told us):
Donc lorsque tu écris :

$s = "abcde12":
$s=~"L$sE";

c'est équivalent à :

$s =~ m/Labcde12E/;

Il y a donc recherche du motif Labcde12E dans $s. Le résultat de cette
recherche est perdu (puisque tu ne récupères pas le résultat de
l'opérateur =~). Et $s n'est pas modifié.



merci. du coup, peut-on récupérer le résultat de =~ ? j'imagine que
oui, vu que le test
if ($s =~ m/Labcde12E/)
va donner quelque-chose...



Oui, on peut. Mais ca n'est pas systematique, ca depend beaucoup de ce
que tu fais avec ta chaine. Typiquement, ca n'est pas frequent du tout avec
s///: pas mal de substitutions sont juste la pour nettoyer. Par exemple:

s/#.*//; # suppression de commentaires
s/(s)s+/$1/g; # suppression d'espaces en trop.

souvent, ca s'utilise effectivement pour des match, pour faire un parser
rudimentaire, genre:

if (m/^(.*?)=(.*)$/) {
my ($var, $value) = ($1, $2);
...
} else # autre cas de figure
...