[ Perl] cmd sort

cmd sort [ Perl] - Perl - Programmation

Marsh Posté le 14-04-2003 à 19:38:29    

Slt all! :)
 
Est-il possible à la cmd sort de perl de s'éxécuter comme "sort -u" sous shell Unix ?
 
Ou une cmd similaire. mais pas de boucle, car trop long. ni de cmd system.  
 
Merci d'avance pour vos réponses. :)

Reply

Marsh Posté le 14-04-2003 à 19:38:29   

Reply

Marsh Posté le 14-04-2003 à 22:29:37    

salut :hello:
si je me souviens ya une fonction qui s'appel exec()  ou un truc du style, regarde dans la doc ;)


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 15-04-2003 à 08:14:17    

vfqs a écrit :

Slt all! :)
 
Est-il possible à la cmd sort de perl de s'éxécuter comme "sort -u" sous shell Unix ?
 
Ou une cmd similaire. mais pas de boucle, car trop long. ni de cmd system.  
 
Merci d'avance pour vos réponses. :)


 
A ma connaissance, ce n'est pas possible de faire ca directement avec le sort. Donc il faut d'abord rendre les elements uniques puis les trier.
 
Voila un bout de code qui fait ca.
 

Code :
  1. my @list = qw!Note that if you re stuck on Microsoft, no solution to this vexing issue is even possible.  Even if Perl were to emulate fork, you d still be hosed, because Microsoft gives no argc/argv-style API.!;
  2. my %seen;
  3. map { $seen{$_}++; } @list;           # on elimine les doublons
  4. my @result = sort keys %seen;         # on trie
  5. print join(":", @result), "\n";

Reply

Marsh Posté le 15-04-2003 à 11:24:14    

SteF_DOBERMANN: Merci pour l'infos, mais après test exec est similaire à system. :(
 
phoenix35: En gros c un peu comme une boucle "for" ton bout de code ?
 
En tout cas ca fonctionne. Est ce plus rapide qu'une boucle for ?


Message édité par vfqs le 15-04-2003 à 11:32:54
Reply

Marsh Posté le 15-04-2003 à 11:45:38    

vfqs a écrit :

SteF_DOBERMANN: Merci pour l'infos, mais après test exec est similaire à system. :(
 
phoenix35: En gros c un peu comme une boucle "for" ton bout de code ?
 
En tout cas ca fonctionne. Est ce plus rapide qu'une boucle for ?


J'avoue le map fait un peu comme une boucle for :ange:  
mais en beaucoup plus rapide.

Reply

Marsh Posté le 15-04-2003 à 12:10:35    

phoenix35 a écrit :


J'avoue le map fait un peu comme une boucle for :ange:  
mais en beaucoup plus rapide.
 

Effectivement, c plus rapide j'ai gagné 20% de temps de traiement. un grand merci  :jap:

Reply

Marsh Posté le 15-04-2003 à 13:50:08    

à noter ausi que sort ne trie pas en ordre alphanumérique, il est un peu bizarre!!

Reply

Marsh Posté le 15-04-2003 à 14:04:30    

arghbis a écrit :

à noter ausi que sort ne trie pas en ordre alphanumérique, il est un peu bizarre!!


 
Ah ? Pourtant d'apres la doc (perldoc -f sort), quand on ne donne pas de fonction ou block de tri, il utilise la comaparison standard des chaines ?
A part en cas d'utilisation de "use locale;" ou la je suppose qu'il se debrouille avec les lettres accentuees, mais j'ai la flemme d'aller lire la doc. Qui a le courage ? Moi je digere...
 
 

Reply

Marsh Posté le 15-04-2003 à 14:08:06    

ben écoute, d'après mon expérience, il trie comme ça :
- en entrée : 1, 2, 3, 4, 10, 100, 1000
- en sortie : 1, 10, 100, 1000, 2, 3, 4
 
sinon, faut que tu fasses une fonctions tri :
sub tri {
$a<=>$b;
}
 
ou $b<=>$a pour du décroissant
 
 
et tu l'utilise comme ça par exemple :
foreach my $a (sort tri(keys(%hash))) {
...
}
 
voilà

Reply

Marsh Posté le 16-04-2003 à 08:23:24    

arghbis a écrit :

ben écoute, d'après mon expérience, il trie comme ça :
- en entrée : 1, 2, 3, 4, 10, 100, 1000
- en sortie : 1, 10, 100, 1000, 2, 3, 4
 
sinon, faut que tu fasses une fonctions tri :
sub tri {
$a<=>$b;
}
 
ou $b<=>$a pour du décroissant
 
 
et tu l'utilise comme ça par exemple :
foreach my $a (sort tri(keys(%hash))) {
...
}
 
voilà


 
 :lol: Ben ca c'est normal comme resultat de tri pour du tri alphanumerique ! Dans alphanumerique, i, ya d'abord alpha. Lorsqu'on compare 2 chaines, dix > Douze > 9 > 2000 > 10
 
Sinon pour ton exemple de tri, n'utilises pas de fonction mais un block si tu veux que ca aille plus vite (d'apres la doc de sort):

Code :
  1. foreach my $a (sort { $a <=> $b } keys(%hash) ) {
  2. ...
  3. }


Message édité par phoenix35 le 16-04-2003 à 08:26:19
Reply

Marsh Posté le 16-04-2003 à 08:23:24   

Reply

Marsh Posté le 16-04-2003 à 11:24:15    

ben autant pour moi, mais qd je veux trier ces nombres, de manière naive je m'attends à ce qu'ils soient dans l'ordre voulu! donc, je disais ça au cas où ... le coup de ton bloc, c bien mais bon si tu utilise 50 fois le tri, ça fait bcp de répétitions

Reply

Marsh Posté le 16-04-2003 à 11:36:07    

arghbis a écrit :

ben autant pour moi, mais qd je veux trier ces nombres, de manière naive je m'attends à ce qu'ils soient dans l'ordre voulu! donc, je disais ça au cas où ... le coup de ton bloc, c bien mais bon si tu utilise 50 fois le tri, ça fait bcp de répétitions


Je suis pas expert en Byte-code perl, mais a mon avis, le block une fois compile ne doit pas prendre trop de place.
Mais si ca t'embette trop, dans ce cas tu fais ta fonction au niveau au-dessus:

Code :
  1. sub tri { return sort { $a <=> $b } @_; }
  2. @resultat = tri @list;


si tes tableaux ne sont pas trop gros ! sinon tu dois commencer a utiliser des references a l'appel et pour le resultat et ca devient lourd.
C'est pour ca, je prefere mettre le block a chaque fois avec un appel direct a sort.
Mais ce n'est qu'un avis tres personnel.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed