Bonjour,
Dans un script, je trie des adresses IP en utilisant la méthode "packed" décrite (entre autres) ici : http://cpan.belfry.net/authors/id/ [...] erperl.txt.
Code :
- sub packed {
- pack('C4', split(/\./, $a)) cmp pack('C4', split(/\./, $b));
- }
- @ip = ('223.1.3.4', '127.0.0.1', '192.168.100.1', '223.1.3.1');
- @result = sort packed @ip;
- print "Sorted: @result\n";
- #
- #prints:
- #
- #------------------- output start---
- # Sorted: 127.0.0.1 192.168.100.1 223.1.3.1 223.1.3.4
- #
- #------------------- output end ---
|
Tout marche très bien pour trier des adresses IP comme dans le bout de code.
En appliquant la même subroutine avec des IP avec le port (écrites sous la forme 192.168.0.100.80), cette routine trie aussi très bien selon les IP mais ne tient pas compte du port (évidement !!).
En toute logique, j'obtiens des tris parfaits sur les 4 premiers champs mais nuls sur le 5ème :
192.168.0.20.xx
192.168.0.100.995
192.168.0.100.110
192.168.0.100.123
192.168.0.100.80
192.168.0.100.25
192.168.0.101.xx
je voudrais pouvoir modifier la subroutine pour pouvoir trier aussi sur le 5ème champ (contenant le port) pour obtenir
192.168.0.20.xx
192.168.0.100.25
192.168.0.100.80
192.168.0.100.110
192.168.0.100.123
192.168.0.100.995
192.168.0.101.xx
Naïvement j'ai essayé de modifier la sub de tri comme ça en supposant qu'elle tiendrait ainsi compte du 5ème champ :
Code :
- sub packed {
- pack('C5', split(/\./, $a)) cmp pack('C5', split(/\./, $b));
- }
|
Mais mlaheureusement c'est pas comme ça que ça marche ...
Si quelqu'un voulait m'expliquer, je serais très content
- de savoir pourquoi
- et d'avoir une piste pour une solution.
P.S. la routine standard contenue dans la doc Perl (cmp || cmp || cmp || cmp || cmp) ne convient pas très bien vu le nombre d'adresses à trier (> 50'000).