Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Charset

4 réponses
Avatar
Carboleum
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

4 réponses

Avatar
Paul Gaborit
À (at) Wed, 20 Apr 2011 17:13:35 +0200,
Carboleum écrivait (wrote):

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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Carboleum
Le Wed, 20 Apr 2011 17:38:04 +0200, Paul Gaborit
a écrit:


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
Avatar
Paul Gaborit
À (at) Wed, 20 Apr 2011 22:11:05 +0200,
Carboleum écrivait (wrote):

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 :
<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/>
Avatar
Carboleum
Le Thu, 21 Apr 2011 00:14:28 +0200, Paul Gaborit
a écrit:



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>




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