Probleme de doublons en PERL

Fermé
ClemClem - 6 mai 2008 à 16:13
 Forest - 7 mai 2008 à 11:36
Bonjour,

Voila j'ai un soucis avec le langage PERL.

j'ai un fichier (on va l'appelé test.txt), d'ou dedans il y a des parametres reseau.

2008-05-03 00:00:17 192.168.19.11 anonymous POST - 202 258
2008-05-03 00:00:24 192.150.1.56 anonymous GET - 200 3230
2008-05-03 00:00:34 192.150.1.56 anonymous GET - 200 3230
2008-05-03 00:00:37 192.168.19.11 anonymous POST - 202 258
2008-05-03 00:00:38 192.168.1.6 anonymous GET - 200 425
2008-05-03 00:00:39 192.168.1.6 anonymous GET - 200 4456
2008-05-03 00:00:39 192.168.1.6 anonymous GET - 200 1253

Et donc je souhaitrai recuperer l'adresse IP, donc ca je sais faire (voila ce que j'ai fais) :

open (FENT, 'Bureau\test.txt') || die "Probleme d'ouverture de fichier => $!";

@lignes= <FENT>;

my @tabIp;
$compteur=0;
foreach my $ligne (@lignes){
if ($ligne=~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s/)
{
$tabIp[$compteur]=$1;
$compteur++;
}
}


MAis c'est la que arrive mon problème, en faite j'aimerai eviter les doublos d'IP c'est à dire dans l'extrait qu'il y a en haut, j'aimerai recuperer juste :

192.168.19.11
192.150.1.56
192.168.1.6

Et donc eviter qu'il me stock dans mon tableau par exemple 192.168.1.6 3 fois mais juste une fois.

J'ai essayer en faisant avec stockant tout dans un tableau et après faire les tests, mais rien ne fonctionne...

J'ai regardé un peu sur tout les forums et toujours rien qui fonctionne. Alors tout aide sera la bienvenue, merci d'avance. Si vous voulez plus d'information, n'hesitez pas ;)
A voir également:

5 réponses

Essaye ça :
open (FENT, 'Bureau\test.txt') || die "Probleme d'ouverture de fichier => $!";
@lignes= <FENT>;
my @tabIp;
foreach my $ligne (<FENT>){
if ($ligne =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s/) {
my $flag = 1;
foreach my $valeur (@tabIp) {
if ( $valeur eq $ligne) {
$flag = 0;
}
}
if ($flag) {
push (@tabIp, $ligne);
}
}
}
close FENT;
0
Donc voila je commence par te remercier d'avoir repondu!!!!

Autrement j'ai essayer et donc après ca pour tester je voulais l'afficher, mais il m'affiche rien. Pour afficher j'ai juste rajouter à la fin : print join(' ',@tabIp);.

Donc voila j'ai essayer mais aucun succés, mais merci encore
0
J'ai oublié d'enlever une petite chose, c'est pour ça que ça ne marche pas.
Ca devrait être mieux maintenant.
open (FENT, 'Bureau\test.txt') || die "Probleme d'ouverture de fichier => $!";
my @tabIp;
foreach my $ligne (<FENT>){
if ($ligne =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s/) {
my $flag = 1;
foreach my $valeur (@tabIp) {
if ( $valeur eq $ligne) {
$flag = 0;
}
}
if ($flag) {
push (@tabIp, $ligne);
}
}
}
close FENT;
0
Donc voila j'ai essayé encore ta nouvelle méthode, mais avec aucun succés a la fin :(, je ne comprend pas pourtant ta version à l'air d'etre correct, j'ai meme essayé avec un while pour lire les lignes des fichiers, mais toujours la meme chose, la il m'affiche quelque chose, c'est sur mais en faite il m'affiche tout c'est à dire
2008-05-03 00:00:17 192.168.19.11 anonymous POST - 202 258
.

Encore merci de prendre de ton temps pour trouver la solution!!! :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
C'était un problème dans ton expression régulière, je ne l'avais pas vérifiée...
open (FENT, 'Bureau\test.txt') || die "Probleme d'ouverture de fichier => $!";
my @tabIp;
foreach my $ligne (<FENT>){
if ($ligne =~ s/(^.* )(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})( .*\n$)/$2/) {
my $flag = 1;
foreach my $valeur (@tabIp) {
if ( $valeur eq $ligne) {
$flag = 0;
}
}
if ($flag) {
push (@tabIp, $ligne);
}
}
}
close FENT;
0
Plus simple :
open (FENT, 'Bureau\test.txt') || die "Probleme d'ouverture de fichier => $!";
my %tabIp;
foreach my $ligne (<FENT>){
if ($ligne =~ s/(^.* )(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})( .*\n$)/$2/) {
$tabIp{$ligne}++;
}
}
close FENT;
print join("\n",keys(%tabIp));
0