<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">hello Gérard<div><br></div><div>curieux...</div><div><br></div><div>j'ai vu ceci:</div><div><br></div><div>"It appears to be a bug the optimisation of constant hash keys. The constant key string in $h{'Góry'} is being downgraded from utf8, whereas if you write my $g = 'Góry'; $h{$g} = 1; it works ok."<br></div><div><a href="https://www.perlmonks.org/index.pl?node_id=1197369">https://www.perlmonks.org/index.pl?node_id=1197369</a></div><div><br></div><div>et effectivement le bug ne se produit pas si au lieu d'utiliser 'clé' tu utilises une variable $cle = 'clé'</div><div><br></div><div><div>#!/usr/bin/perl</div><div><br></div><div>use strict;</div><div>use warnings;</div><div>use utf8;</div><div>use Devel::Peek;</div><div>use Data::Dumper;</div><div>$Data::Dumper::Useqq = 1;</div><div><br></div><div>my $cle = 'clé';</div><div>my %hash = (</div><div> $cle => 0,</div><div>);</div><div>my $key = (keys %hash)[0];</div><div>Dump($key);</div><div>print Dumper($key);</div><div><br></div><div>$hash{$cle} = 1;</div><div>$key = (keys %hash)[0];</div><div><br></div><div>Dump($key);</div><div>print Dumper($key);</div><div><br></div><div>utf8::upgrade($key);</div><div>Dump($key);</div><div>print Dumper($key);</div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Dec 1, 2018 at 1:03 AM Gérald SÉDRATI-DINET <<a href="mailto:gerald@sedrati-dinet.net">gerald@sedrati-dinet.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Salut les Mongueurs!<br>
<br>
Ça faisait longtemps que je n'avais pas posté ici, mais maintenant que<br>
j'ai la joie de retravailler en Perl, j'ai aussi celle de partager à<br>
nouveau de vos lumières :)<br>
<br>
Je suis tombé sur un étrange comportement, sur toutes les versions de<br>
Perl que j'ai pu testées (entre la 5.16 et la 5.26).<br>
<br>
Il y a une question sur stack overflow<br>
(<a href="https://stackoverflow.com/questions/8418496/hash-keys-encoding-why-do-i-get-here-with-develpeekdump-two-different-resul" rel="noreferrer" target="_blank">https://stackoverflow.com/questions/8418496/hash-keys-encoding-why-do-i-get-here-with-develpeekdump-two-different-resul</a>)<br>
qui date de quelques années mais sans réponse s'il s'agit ou non d'un<br>
bug d'optimisation ou d'un comportement normal.<br>
<br>
Le problème et que si vous initialisez un hash avec une clé ayant des<br>
caractères non-ascii (par ex. du iso-8859-1), la clé est correctement<br>
encodée en UTF8 (avec le flag UTF8 positionné). Mais si vous assignez<br>
ensuite une valeur à l'élément du hash correspondant à cette clé,<br>
celle-ci est déclassée (comme avec un utf8::downgrade, probablement<br>
encodée en iso-8859-1). Je vous laisse imaginer les conséquences si vous<br>
avez à manipuler cette clé pour une raison ou pour une autre, en vous<br>
attendant à ce qu'elle soit encodée en UTF8…<br>
<br>
Voilà un script montrant le problème:<br>
<br>
#!/usr/bin/perl<br>
<br>
use strict;<br>
use warnings;<br>
use utf8;<br>
use Devel::Peek;<br>
use Data::Dumper;<br>
$Data::Dumper::Useqq = 1;<br>
<br>
my %hash = (<br>
'clé' => 0,<br>
);<br>
my $key = (keys %hash)[0];<br>
Dump($key);<br>
print Dumper($key);<br>
<br>
$hash{'clé'} = 1;<br>
$key = (keys %hash)[0];<br>
<br>
Dump($key);<br>
print Dumper($key);<br>
<br>
utf8::upgrade($key);<br>
Dump($key);<br>
print Dumper($key);<br>
[download]<br>
<br>
avec le résultat suivant:<br>
<br>
SV = PV(0x555ed17dfe60) at 0x555ed1809710<br>
REFCNT = 1<br>
FLAGS = (POK,pPOK,UTF8)<br>
PV = 0x555ed1993ed0 "cl\303\251"\0 [UTF8 "cl\x{e9}"]<br>
CUR = 4<br>
LEN = 5<br>
$VAR1 = "cl\x{e9}";<br>
SV = PV(0x555ed17dfe60) at 0x555ed1809710<br>
REFCNT = 1<br>
FLAGS = (POK,IsCOW,pPOK)<br>
PV = 0x555ed1909b10 "cl\351"<br>
CUR = 3<br>
LEN = 0<br>
$VAR1 = "cl\351";<br>
SV = PV(0x555ed17dfe60) at 0x555ed1809710<br>
REFCNT = 1<br>
FLAGS = (POK,pPOK,UTF8)<br>
PV = 0x555ed1825350 "cl\303\251"\0 [UTF8 "cl\x{e9}"]<br>
CUR = 4<br>
LEN = 10<br>
$VAR1 = "cl\x{e9}";<br>
[download]<br>
<br>
Comme dans ce code, on peut résoudre le problème en surclassant en UTF8<br>
(utf8::upgrade) la clé. Mais j'aurais jamais imaginé devoir faire ça<br>
avant de tomber sur le problème. J'ai rien lu dans perldoc qui explique<br>
ce comportement.<br>
<br>
Vous avez une idée d'explication, si c'est ou non voulu ?<br>
<br>
Merci!<br>
-- <br>
Gérald Sédrati-Dinet<br>
<a href="https://pascontent.sedrati-dinet.net" rel="noreferrer" target="_blank">https://pascontent.sedrati-dinet.net</a> <a href="https://www.april.org" rel="noreferrer" target="_blank">https://www.april.org</a><br>
<a href="https://www.unitary-patent.eu" rel="noreferrer" target="_blank">https://www.unitary-patent.eu</a> <a href="https://laquadrature.net" rel="noreferrer" target="_blank">https://laquadrature.net</a><br>
<br>
_______________________________________________<br>
Perl mailing list<br>
<a href="mailto:Perl@mongueurs.net" target="_blank">Perl@mongueurs.net</a><br>
<a href="http://listes.mongueurs.net/mailman/listinfo/perl" rel="noreferrer" target="_blank">http://listes.mongueurs.net/mailman/listinfo/perl</a><br>
Attention, les archives sont publiques</blockquote></div>