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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #23298541
À (at) Wed, 20 Apr 2011 17:13:35 +0200,
Carboleum
Bonjour à tous,

Sous AutoLISP (lisp sour AutoCAD), il y a une fonction qui trie une
liste 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 ?



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 -
Carboleum
Le #23299111
Le Wed, 20 Apr 2011 17:38:04 +0200, Paul Gaborit


Il n'y a pas que le _ qui pose problème. Le tri des majuscules et de s
minuscules est aussi particulier (par rapport à un tri sur les point s de
code par exemple).




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 ;-)


mais, sans informations plus précises ou des exemples plus complets,
c'est absolument sans garantie ! ;-)




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
Paul Gaborit
Le #23299401
À (at) Wed, 20 Apr 2011 22:11:05 +0200,
Carboleum
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
AutoLISP pour trier des noms de fichiers:

en AutoLISP:
(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 :

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 -
Carboleum
Le #23300561
Le Thu, 21 Apr 2011 00:14:28 +0200, Paul Gaborit



La page ci-dessous donne un très bonne aperçu de ce que ça donne pour
les caractères pris un à un :




J'avais oublié autocad.xarch.at... il faut dire qu'il ne semble plus
maintenu depuis belle lurettes.

C'est déjà un bon départ pour réaliser 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 à la fonction de tri des noms de
fichiers de Windows qui est très particulière.



En effet ca ressemble à l'ordre de l'explorer Windows.


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.




Non, acad_strlsort imite Windows, mais pas jusque là ;-)


Dans ce cas, cherchez des fonctions appelées "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ô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
Publicité
Poster une réponse
Anonyme