Charset
Le
Carboleum
Bonjour à tous,
Sous AutoLISP (lisp sour AutoCAD), il y a une fonction qui trie une list=
e =
de string de façon 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ê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 ?
Merci d'avance
-- =
http://carboleum.be/portfolio
Sous AutoLISP (lisp sour AutoCAD), il y a une fonction qui trie une list=
e =
de string de façon 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ê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 ?
Merci d'avance
-- =
http://carboleum.be/portfolio

Poser une question


Carboleum
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 - Perl en français -
En effet, j'avais pas fait attention. D'après mes tests, il ne tient p as
compte de la casse. Ce qui n'est pas forcément étonnant pour AutoCAD ;-)
C'est vrais que mon exemple était un peu laconique...
Je cherche donc à reproduire en perl la méthode de tri utilisée 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 = 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ès intéressant; Mais pas d ans
mon cas puisque le "_" doivent être en premier, c'est-à-dire être
considéré comme un caractère significatif.
Tout porte à croire que si je parviens à dire à perl de ne pas ten ir
compte de la casse, j'ai gagné:
perl -e 'map { $tbl{lc($_)} = $_ } (@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ème réside avec les chiffre.
Une entourloupe consiste à remplacer les "_" par """ (interdit dans u n
nom de fichier) avant de trier:
$ perl -e 'map { $k=$_; $k=~s/_/"/g; $tbl{lc($_)} = $_ } (@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ès propre...
Existe-t-!l un charset qui place les chiffres entre le underscore et les
lettre minuscules ?
Merci
--
http://carboleum.be
Carboleum
C'est le moins qu'on puisse dire. ;-)
[...]
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 :
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 - Perl en français -
J'avais oublié autocad.xarch.at... il faut dire qu'il ne semble plus
maintenu depuis belle lurettes.
En effet ca ressemble à l'ordre de l'explorer Windows.
Non, acad_strlsort imite Windows, mais pas jusque là ;-)
Comme je maitrise mieux AutoLISP, je crois que je vais plutôt utiliser une
fonction AutoLISP qui trie convenablement (sisi ca existe). L'essentiel
est que les deux AutoCAD et PERL trient de la même façon.
En tous cas, grand merci!
à +
--
http://carboleum.be