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

Trie unique dans un tableau à 2 dimensions

1 réponse
Avatar
jmarcth
Bonjour =E0 tous,

Je suis d=E9butant en programmation PERL, et je gal=E8re 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=E9sire effectuer est un affichage IP / MAC en effectuant
un tri unique sur l'adresse mac, donc un r=E9sultat 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=E8re
occurrence)


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

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

#!/usr/bin/perl

my $fichier=3D"./plop";

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

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

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


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

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


Merci pour votre aide.
Bonne journ=E9e =E0 tous
JM

1 réponse

Avatar
jl_morel
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