Trie unique dans un tableau à 2 dimensions

Le
jmarcth
Bonjour à tous,

Je suis débutant en programmation PERL, et je galère un peu pour
faire du trie.
Soit la liste suivante ( ip, adresses MAC) :

.
10.0.0.50-
10.0.0.51-
10.0.0.110-00:04:F2:10:A1:45
10.0.0.128-00:04:F2:10:9F:35
10.0.0.129-00:04:F2:10:A1:09
10.0.0.138-00:0E:50:3A:DB:A5
10.0.0.145-00:0E:50:3A:DB:A5
.

Ce que je désire effectuer est un affichage IP / MAC en effectuant
un tri unique sur l'adresse mac, donc un résultat de ce genre :

10.0.0.110-00:04:F2:10:A1:45
10.0.0.128-00:04:F2:10:9F:35
10.0.0.129-00:04:F2:10:A1:09
10.0.0.138-00:0E:50:3A:DB:A5 # ( on prend seulement la première
occurrence)


Je suis arrivé à cela, mais il me manque le reste :(,
malgré plusieurs recherches, je tourne en rond.

##############################################
##############################################

#!/usr/bin/perl

my $fichier="./plop";

open(FD, "$fichier") or die "Can't open $fichier: $!";
@lines=<FD>;
# Fermeture du fichier
close(FD);

@tableau = sort {
(split '-', $a)[1] cmp (split '-', $b)[1]
} @lines ;

foreach $line (@tableau) {
# Enlever le retour chariot de fin de ligne
chomp($line=$line);
# On coupe la ligne en utilisant comme séparateur '-'
($ip, $mac) = split("-", $line);
print "$ip $mac ";
}


##############################################
##############################################

En gros je fais un trie du 2 champs mais rien de plus


Merci pour votre aide.
Bonne journée à tous
JM
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
jl_morel
Le #17683451
Dans l'article <b6705454-3e36-494a-987c-
, a dit...
Soit la liste suivante ( ip, adresses MAC) :

....
10.0.0.50-
10.0.0.51-
10.0.0.110-00:04:F2:10:A1:45
10.0.0.128-00:04:F2:10:9F:35
10.0.0.129-00:04:F2:10:A1:09
10.0.0.138-00:0E:50:3A:DB:A5
10.0.0.145-00:0E:50:3A:DB:A5
....

Ce que je désire effectuer est un affichage IP / MAC en effectuant
un tri unique sur l'adresse mac, donc un résultat de ce genre :

10.0.0.110-00:04:F2:10:A1:45
10.0.0.128-00:04:F2:10:9F:35
10.0.0.129-00:04:F2:10:A1:09
10.0.0.138-00:0E:50:3A:DB:A5 # ( on prend seulement la première
occurrence)




Puisque que vous voulez supprimer les doublons de votre liste (et garder la
première occurrence), une solution est d'utiliser un hash qui, à une adresse
MAC, va associer la ligne complète. On classe ensuite les clés du hash. On
peut utiliser l'ordre alphanumérique sur les clés de hash si vos adresses
MAC sont "standard". En particulier, il faut que les lettres soient en
majuscules pour que la comparaison donne le même ordre que le numérique (AB
est avant AC ... mais aB est après AC). Sinon utiliser la fonction uc.

Dans l'exemple ci-dessous j'utilise un tableau pour les lignes. Si vous
lisez les lignes depuis un fichier vous pouvez remplir directement le
hash : pas besoin de tableau intermédiaire.

#!/usr/bin/perl
use strict;
use warnings;

my @lines = qw(
10.0.0.110-00:04:F2:10:A1:45
10.0.0.128-00:04:F2:10:9F:35
10.0.0.129-00:04:F2:10:A1:09
10.0.0.138-00:0E:50:3A:DB:A5
10.0.0.145-00:0E:50:3A:DB:A5
);

my %mac2line; # hash mac => line

foreach (@lines) {
my ($mac) = $_ =~ /-(.+)$/; # extraction adresse mac
next if exists $mac2line{$mac}; # on prend le premier seulement
$mac2line{$mac} = $_;
}

foreach ( sort keys %mac2line ) { # tri par ordre alphanumérique
print $mac2line{$_}, "n";
}

__END__

HTH

--
J-L.M.
http://www.bribes.org/perl
Publicité
Poster une réponse
Anonyme