Discussion:
Charset
(trop ancien pour répondre)
Carboleum
2011-04-20 15:13:35 UTC
Permalink
Bonjour =E0 tous,

Sous AutoLISP (lisp sour AutoCAD), il y a une fonction qui trie une list=
e =

de string de fa=E7on surprenante:
(acad_strlsort '("1" "3" "_" "a" "A" "b" "B")) me renvoie ceci: ("_" "1=
" =

"3" "a" "A" "b" "B")
Notez la position incongrue du "_"

Or perl trie autrement: $ perl -e 'print sort (1,3,_,a,A,b,B)' m'affiche=
=

cela: 13AB_ab

J'aimerai que perl trie de la m=EAme fa=E7on qu'AutoLISP.

J'ai cherch=E9 les charset, je ne trouve pas celui qui met l'underscore =
=

avant l'alphabet.

Quel est donc ce charset et comment l'utiliser dans perl ?

Merci d'avance




-- =

http://carboleum.be/portfolio
Paul Gaborit
2011-04-20 15:38:04 UTC
Permalink
À (at) Wed, 20 Apr 2011 17:13:35 +0200,
Bonjour à tous,
Sous AutoLISP (lisp sour AutoCAD), il y a une fonction qui trie une
(acad_strlsort '("1" "3" "_" "a" "A" "b" "B")) me renvoie ceci: ("_"
"1" "3" "a" "A" "b" "B")
Notez la position incongrue du "_"
Or perl trie autrement: $ perl -e 'print sort (1,3,_,a,A,b,B)'
m'affiche cela: 13AB_ab
J'aimerai que perl trie de la même façon qu'AutoLISP.
J'ai cherché les charset, je ne trouve pas celui qui met l'underscore
avant l'alphabet.
Quel est donc ce charset et comment l'utiliser dans perl ?
Il n'y a pas que le _ qui pose problème. Le tri des majuscules et des
minuscules est aussi particulier (par rapport à un tri sur les points de
code par exemple).

À première vue, l'ordre peut correspondre à ce que propose
Unicode::Collate par défaut :

perl -MUnicode::Collate \
-e 'my $c = Unicode::Collate->new(); print($c->sort(1,3,_,a,A,b,B), "\n")'

qui affiche :

_13aAbB

mais, sans informations plus précises ou des exemples plus complets,
c'est absolument sans garantie ! ;-)
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Carboleum
2011-04-20 20:11:05 UTC
Permalink
Le Wed, 20 Apr 2011 17:38:04 +0200, Paul Gaborit =
Il n'y a pas que le _ qui pose probl=E8me. Le tri des majuscules et de=
s
minuscules est aussi particulier (par rapport =E0 un tri sur les point=
s de
code par exemple).
En effet, j'avais pas fait attention. D'apr=E8s mes tests, il ne tient p=
as =

compte de la casse. Ce qui n'est pas forc=E9ment =E9tonnant pour AutoCAD=
;-)
mais, sans informations plus pr=E9cises ou des exemples plus complets,=
c'est absolument sans garantie ! ;-)
C'est vrais que mon exemple =E9tait un peu laconique...

Je cherche donc =E0 reproduire en perl la m=E9thode de tri utilis=E9e pa=
r =

AutoLISP pour trier des noms de fichiers:

en AutoLISP:
(mapcar 'print (acad_strlsort (vl-directory-files "c:/__Lisp/mngt/test")=
))

"."
".."
"__List_handling.lsp"
"__Math.lsp"
"__String_handling.lsp"
"_3d.lsp"
"_Make.lsp"
"_Matrix.lsp"
"_String.lsp"
"Ascii.lsp"
"B-test.lsp"
"bl-macro.lsp"
"bl-share.lsp"
"expt.lsp"

en perl:
(proposition de Paul)

$ perl -MUnicode::Collate -e 'my $c =3D Unicode::Collate->new(); map { p=
rint =

$_."\n" } ($c->sort(@ARGV))' *.lsp
_3d.lsp
Ascii.lsp
bl-macro.lsp
bl-share.lsp
B-test.lsp
expt.lsp
__List_handling.lsp
_Make.lsp
__Math.lsp
_Matrix.lsp
__String_handling.lsp
_String.lsp

Uniode::Collate->sort a un comportement tr=E8s int=E9ressant; Mais pas d=
ans =

mon cas puisque le "_" doivent =EAtre en premier, c'est-=E0-dire =EAtre =
=

consid=E9r=E9 comme un caract=E8re significatif.

Tout porte =E0 croire que si je parviens =E0 dire =E0 perl de ne pas ten=
ir =

compte de la casse, j'ai gagn=E9:

perl -e 'map { $tbl{lc($_)} =3D $_ } (@ARGV); map { print $tbl{$_}."\n" =
} =

(sort keys %tbl)' *.lsp
_3d.lsp
__List_handling.lsp
__Math.lsp
__String_handling.lsp
_Make.lsp
_Matrix.lsp
_String.lsp
Ascii.lsp
B-test.lsp
bl-macro.lsp
bl-share.lsp
expt.lsp

Le probl=E8me r=E9side avec les chiffre.

Une entourloupe consiste =E0 remplacer les "_" par "\"" (interdit dans u=
n =

nom de fichier) avant de trier:


$ perl -e 'map { $k=3D$_; $k=3D~s/_/\"/g; $tbl{lc($_)} =3D $_ } (@ARGV)=
; map { =

print $tbl{$_}."\n" } (sort keys %tbl)' *.lsp
__List_handling.lsp
__Math.lsp
__String_handling.lsp
_3d.lsp
_Make.lsp
_Matrix.lsp
_String.lsp
Ascii.lsp
B-test.lsp
bl-macro.lsp
bl-share.lsp
expt.lsp

Ca fonctionne mais c'est pas tr=E8s propre...
Existe-t-!l un charset qui place les chiffres entre le underscore et les=
=

lettre minuscules ?

Merci

-- =

http://carboleum.be
Paul Gaborit
2011-04-20 22:14:28 UTC
Permalink
À (at) Wed, 20 Apr 2011 22:11:05 +0200,
C'est vrais que mon exemple était un peu laconique...
C'est le moins qu'on puisse dire. ;-)
Je cherche donc à reproduire en perl la méthode de tri utilisée par
(mapcar 'print (acad_strlsort (vl-directory-files "c:/__Lisp/mngt/test")))
[...]
Existe-t-!l un charset qui place les chiffres entre le underscore et
les lettre minuscules ?
Une petite recherche sur internet montre bien que la fonction
acad_strlsort ne se base pas du tout sur un charset quelconque...

La page ci-dessous donne un très bonne aperçu de ce que ça donne pour
les caractères pris un à un :
<http://autocad.xarch.at/news/faq/misc/strlsort-bug.html>

C'est déjà un bon départ pour réaliser votre propre fonction de tri.

Mais quand on voit l'ordre ci-dessus, on se dit qu'il est fort possible
que cette fonction fasse en fait appel à la fonction de tri des noms de
fichiers de Windows qui est très particulière. Pour en être sûr,
testez-la avec des noms qui comporte des nombres. Par exemple "a8",
"a9", "a10"... Si "a10" sort en dernier alors vous pouvez en être sûr.

Dans ce cas, cherchez des fonctions appelées "natural sort" ou "human
sort". Il y a par exemple lemodule CPAN Sort-Key qui propose la fonction
'natsort' dans Sort::Key::Natural.
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Carboleum
2011-04-21 12:38:00 UTC
Permalink
Le Thu, 21 Apr 2011 00:14:28 +0200, Paul Gaborit =
La page ci-dessous donne un tr=E8s bonne aper=E7u de ce que =E7a donne=
pour
<http://autocad.xarch.at/news/faq/misc/strlsort-bug.html>
J'avais oubli=E9 autocad.xarch.at... il faut dire qu'il ne semble plus =

maintenu depuis belle lurettes.
C'est d=E9j=E0 un bon d=E9part pour r=E9aliser votre propre fonction d=
e tri.
Mais quand on voit l'ordre ci-dessus, on se dit qu'il est fort possibl=
e
que cette fonction fasse en fait appel =E0 la fonction de tri des noms=
de
fichiers de Windows qui est tr=E8s particuli=E8re.
En effet ca ressemble =E0 l'ordre de l'explorer Windows.
Pour en =EAtre s=FBr,
testez-la avec des noms qui comporte des nombres. Par exemple "a8",
"a9", "a10"... Si "a10" sort en dernier alors vous pouvez en =EAtre s=FB=
r.
Non, acad_strlsort imite Windows, mais pas jusque l=E0 ;-)
Dans ce cas, cherchez des fonctions appel=E9es "natural sort" ou "huma=
n
sort". Il y a par exemple lemodule CPAN Sort-Key qui propose la foncti=
on
'natsort' dans Sort::Key::Natural.
Comme je maitrise mieux AutoLISP, je crois que je vais plut=F4t utiliser=
une =

fonction AutoLISP qui trie convenablement (sisi ca existe). L'essentiel =
=

est que les deux AutoCAD et PERL trient de la m=EAme fa=E7on.

En tous cas, grand merci!

=E0 +


-- =

http://carboleum.be

Continuer la lecture sur narkive:
Loading...