<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&#39;ai vu ceci:</div><div><br></div><div>&quot;It appears to be a bug the optimisation of constant hash keys. The constant key string in $h{&#39;Góry&#39;} is being downgraded from utf8, whereas if you write my $g = &#39;Góry&#39;; $h{$g} = 1; it works ok.&quot;<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&#39;utiliser &#39;clé&#39; tu utilises une variable $cle = &#39;clé&#39;</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 = &#39;clé&#39;;</div><div>my %hash = (</div><div>    $cle =&gt; 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 &lt;<a href="mailto:gerald@sedrati-dinet.net">gerald@sedrati-dinet.net</a>&gt; 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&#39;avais pas posté ici, mais maintenant que<br>
j&#39;ai la joie de retravailler en Perl, j&#39;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&#39;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&#39;il s&#39;agit ou non d&#39;un<br>
bug d&#39;optimisation ou d&#39;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&#39;é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&#39;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>
    &#39;clé&#39; =&gt; 0,<br>
);<br>
my $key = (keys %hash)[0];<br>
Dump($key);<br>
print Dumper($key);<br>
<br>
$hash{&#39;clé&#39;} = 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 &quot;cl\303\251&quot;\0 [UTF8 &quot;cl\x{e9}&quot;]<br>
  CUR = 4<br>
  LEN = 5<br>
$VAR1 = &quot;cl\x{e9}&quot;;<br>
SV = PV(0x555ed17dfe60) at 0x555ed1809710<br>
  REFCNT = 1<br>
  FLAGS = (POK,IsCOW,pPOK)<br>
  PV = 0x555ed1909b10 &quot;cl\351&quot;<br>
  CUR = 3<br>
  LEN = 0<br>
$VAR1 = &quot;cl\351&quot;;<br>
SV = PV(0x555ed17dfe60) at 0x555ed1809710<br>
  REFCNT = 1<br>
  FLAGS = (POK,pPOK,UTF8)<br>
  PV = 0x555ed1825350 &quot;cl\303\251&quot;\0 [UTF8 &quot;cl\x{e9}&quot;]<br>
  CUR = 4<br>
  LEN = 10<br>
$VAR1 = &quot;cl\x{e9}&quot;;<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&#39;aurais jamais imaginé devoir faire ça<br>
avant de tomber sur le problème. J&#39;ai rien lu dans perldoc qui explique<br>
ce comportement.<br>
<br>
Vous avez une idée d&#39;explication, si c&#39;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>