Même sortie avec printf : ï
Là, je commence à sécher...
Ton sort avec le use locale à le même comportement pour moi, quand j'utilise le sort de la classe unicode::Collate
sinon, peux-tu tester le perl (exact) ci dessous:
Attention: le lancer comme ceci et donner le résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #!/usr/bin/env perl my @liste = qw/cales abricot entonnoir couchette aïd arrosoir caleçon élève zozo/ ; use locale; print join(' ',sort(@liste))."\n";
Ensuite, supprimer ou commenter la ligne 'use locale' et relancer la même commande.
Code : Sélectionner tout - Visualiser dans une fenêtre à part bash -c "ltrace perl xyz3.pl" 2>&1 | grep -A 1 strxfrm
Ceci, c'est pour vérifier que le sort passe bien par l'appel système de transformation quand on utilise la locale.
Cordialement.
Avec ou sans use locale je n'ai aucune sortie (j'ai vérifié aussi sans le grep, c'est ok).
Sans le grep, tu devrais avoir une multitude de sortie sur l'écran...
Si tu n'as rien, c'est qu'il y a un souci.
Cordialement.
Non non, sans le grep j'ai bien plein de lignes, mais avec je n'ai rien.
Voici une alternative qui devrait fonctionner:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #!/usr/bin/env perl use strict; use warnings; use diagnostics; use POSIX qw(strcoll strxfrm); my @liste = qw/cales abricot entonnoir couchette aïd arrosoir caleçon élève zozo/ ; # sans la locale print join(' ',sort @liste) . "\n"; # Première méthode avec locale print join(' ',sort {strxfrm($a) cmp strxfrm($b)} @liste) . "\n"; # Deuxième méthode avec locale (certainement plus rapide que la première) print join(' ',sort {strcoll($a,$b)} @liste) . "\n";
Cordialement.
Impeccable, ça fonctionne :
Tu peux m'expliquer tout ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 abricot arrosoir aïd cales caleçon couchette entonnoir zozo élève abricot aïd arrosoir caleçon cales couchette élève entonnoir zozo abricot aïd arrosoir caleçon cales couchette élève entonnoir zozo
Je ne sais pas pourquoi chez toi, l'utilisation du use locale ne fonctionne pas (au moins pour le tri), et donc je te fait passer par ce quoi il passe quand il fonctionne.
les fonctions de la libc:
strxfrm( str ) ==> retourne une chaine transformée de str pour pouvoir la comparer à une autre chaine transformée.
strcoll ==> retourne le résultat comparatif de 2 chaines.
En fait strcoll(s1,s2) est égale à strxfrm(s1) cmp strxfrm(s2) ...
Dans les fait, perl appelle strxfrm avec le use locale (enfin, en principe), mais dans la doc perllocale, il déconseille de l'utiliser (suite à un souci possible dans le cas d'un seul caractère).
Et sinon, à titre informatif, la commande sort de linux utilise strcoll.
En bref, je t'ai fourni juste un contournement pour ta version de perl qui semble ne pas gérer correctement le module locale.
Cordialement.
Je te remercie.
C'est donc un bug lié à mon système, ce que je trouve très embarrassant, mais contournable grâce à toi.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager