IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SGBD Perl Discussion :

Select distinct sous PERL ?


Sujet :

SGBD Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Select distinct sous PERL ?
    Bonjour, je viens vous exposer un petit probleme :

    Je suis en train de creer un script en perl et je me retrouve à un moment donné avec un tableau trié contenant des adresse IP et des ports du type -->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    192.168.XX.XX:110
    192.168.XX.XX:80
    etc ...
    Or certaines de ses valeurs sont en double je souhaiterai donc les recuperer et les compter. Pour se faire j'aurai voulu creer un tableau à deux entrée dont la premiere colonne contiendrai les ip/ports et la deuxieme le nombre d'occurences. Idéalement se qu'il me faudrai serai un equivalent de la fonction SQL "SELECT DISTINCT" qui permet de selectionner les valeurs distinctes comme son nom l'indique. Mais malgrés mes recherches je ne trouve rien d'equivalent en PERL ...

    Avant de me lancer dans l'ecriture d'une fonction remplissant cette tache je voudrais savoir si elle n'existe pas déjà.

    Par avance merci.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    En Perl, dés lors qu'on commence à parler de doublons, de valeurs distinctes, etc, il faut avoir le réflexe hash.
    En l'occurence ce que tu demandes est trivial à faire avec un hash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @tab_ips;
    #remplissage de @tab_ips
    my %ips;
    foreach my $ip (@tab_ips){
        $ips{$ip}++;
    }
    A la fin, le hash %ips contient exactement ce que tu veux.

    --
    Jedaï

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my (%ip,@tab_ips);
    my @distinct = grep { ! $ip{$_}++ } @tab_ips;
    lami20j
    --
    lami20j

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour ses reponses ^^
    Je dois avouer que je suis toujours surpris par la promptitude avec laquelle elles arrivent !

    Pour se qui est des hash je dois vous faire un aveu --> j'ai lu à plusieur reprise qu'il s'agissait en quelque sorte de se qui fait la puissance du PERL mais je n'avais jamais compris leur fonctionnement (inutile de preciser je pense que je suis encore un débutant en la matiére)

    Je test ça sur le champ et je pense que je pourrais cloturer le sujet.
    Encore merci


    |------|
    | EDIT |
    |------|


    Bon je crois que je vais attendre un peut pour clore ... je pige pas grand chose a vos reponses en fait ... Je vais continuer a chercher et le cas echeant je reposterai pour vous demander des precisions ^^

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut
    Citation Envoyé par lami20j
    Salut,

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my (%ip,@tab_ips);
    my @distinct = grep { ! $ip{$_}++ } @tab_ips;
    lami20j
    En fait ce que j'ai écrit te donne un tableau des ip en enlevant les doubles. Donc j'ai mal compris.
    Tu veux en fait
    Or certaines de ses valeurs sont en double je souhaiterai donc les recuperer et les compter
    En ce cas le code change un peu ( j'ai enlevé la négation ! )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my (%ip,@tab_ips);
    my @ip_doubles = grep { $ip{$_}++ } @tab_ips;
    Donc @ip_doubles contient tous les IP en double (j'espère que tu n'as pas des triplets - si oui le dans le code que Jedai t'as donné tu cherches les ip dont la valeurs de $ips{$cle} == 2).
    Et pour savoir le nombre tu n'as qu'a compter les éléments du tableau.

    Calculer la taille d'un tableau :
    ou
    ou
    ou....tmtowtdi

    lami20j
    --
    lami20j

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par makubex
    Pour se qui est des hash je dois vous faire un aveu --> j'ai lu à plusieur reprise qu'il s'agissait en quelque sorte de se qui fait la puissance du PERL mais je n'avais jamais compris leur fonctionnement (inutile de preciser je pense que je suis encore un débutant en la matiére)
    Les hashs n'ont rien de mystérieux à l'emploi en fait : c'est juste des tableaux dont les cases sont indicés par des chaînes de caractères, et pas par des entiers.
    Une variable contenant un hash commence par un '%', exemple "%mon_hash_a moi", on peut récupérer la valeur indicé par 'bonjour' avec "$mon_hash_a_moi{bonjour}", on peut récupérer la liste des clés avec "keys %mon_hash", ou la liste des valeurs avec "values %mon_hash" (attention, ces listes sont dans un ordre aléatoire, c'est pourquoi on fait souvent "sort keys %mon_hash" pour les récupérer.
    Il faut également savoir que si on fait "$mon_hash{bonjour} = 42;", le hash contiendra un couple clé/valeur bonjour/42, même si "bonjour" ne faisait pas partie des clés du hash auparavant.
    Dans notre cas, j'ai écris "$ips{$ip}++", donc si $ip n'était pas encore une clé de %ips, cette clé va être créée avec une valeur "undef", et undef se comporte comme 0 en contexte numérique, donc "undef++" = 1, donc $ips{$ip} va prendre la valeur 1. Les fois suivantes, $ips{$ip} va simplement augmenter, au final $ips{une_ip} sera donc égal au nombre de fois que "une_ip" était présente dans ton tableau.

    --
    Jedaï

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par Jedai
    Les fois suivantes, $ips{$ip} va simplement augmenter, au final $ips{une_ip} sera donc égal au nombre de fois que "une_ip" était présente dans ton tableau.
    Si je peux me permettre .

    En fait $ips{$ip} va augmenter (sera incrementé) dans la cas d'une répetition d'IP. Et ça parce que dans un hash la clé est unique.

    $hash{'salut'} = "bonjour";
    $hash{'salut'} = "hello";

    ce n'est pas possible dans un hash de cette façon (il faut utiliser des réfèrences pour ça).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{'salut'} = [ 'bonjour', 'hello' ];# un tableau anonyme ; c'était seulement un exemple
    Donc si on trouve dans un tableau bonjour et hello alors $hash{'salut'} aura la valeur 2 (trouvé une forme de salut 2 fois).

    Tu peux voir un hash comme une petite base de donées dont le 1er champ contient les clès (clès primaires et uniques) et le 2 champ une valeur (qui peut être n'importe quoi)

    Dans mon exemple j'utilise exactement la même raisonnement que jedai mais exprimé d'une autre façon dison Perl idiomatique.

    lami20j
    --
    lami20j

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je pensais qu'il était clair que "les fois suivantes" désignait la prochaine fois qu'on rencontre la même ip...
    La façon de lami20j est effectivement plus idiomatique, j'ai choisi d'utiliser un foreach parce que cela me semblait plus didactique, dans mes propre programme j'emploierais effectivement plutôt un grep.

    --
    Jedaï

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par Jedai
    j'ai choisi d'utiliser un foreach parce que cela me semblait plus didactique
    Tu as tout à fait raison. Je n'ai pas pensé à ça.
    Encore une fois la preuve qu'un maître reste un maître (toujours exigeant avec lui même, mais indulgent avec les lambda(s) )

    lami20j
    --
    lami20j

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    J'ai finalemet reussi grace a vos conseils à creer un hash contenant {'ip:port'}= nombre d'occurences

    mais voilà --> deuxieme probleme, en plus de l'ip et du port j'ai un peut etoffé et j'ai :

    ip_source|port_source|ip_destination|port_destination|nombre_d_octets

    il s'agis d'extraits de log d'un firewall.

    En relisant attentivement le chapitre expliquant le fonctionnement des hash du livre sur perl que je me suis acheté, je me suis rendu compte qu'on pouvais faire des "hash de hash"

    Pour l'instant je suis en train de traiter l'information comme tel :

    j'ai un tableau contenant la liste des IP qui me sert d'index : @liste
    trié par ordre alphabetique.

    ex:
    $liste[0]=192.168.0.1
    $liste[1]=192.168.0.1
    $liste[2]=192.168.0.1
    $liste[3]=192.168.0.2
    $liste[4]=192.168.0.3
    $liste[5]=192.168.0.3
    $liste[6]=192.168.0.3
    $liste[7]=192.168.0.4

    Je compte donc me servire de $liste[$y] pour indexer mes hash et a l'interieur remplire comme suit

    %mon_hash--->{$liste[$y]}-->{'ip_in']=192.168.0.1
    {'port_in'}=110
    {'ip_out'}=191.125.14.5
    {'port_out'}=110
    {'octets'}=254


    techniquement il devrai juste me suffire de selectionner les IP que je souhaite, recuperer les index de liste correspondant et je peut avoir ainsi toutes les information concernant une machine non ?

    en se faisant je devrais pouvoir trier mes infos en fonction de l'adresse IP non ?

    mon but (j'ai oublié de le preciser) est de generer automatiquement une page pour un intranet contenant le recapitulatif de toutes les connections entrantes et sortantes du reseau interne afin de surveiller le trafic. Mais comme les information sont en nombre je ne peut pas me permetre de tout placer dans un simple tableau.

    Se qui est pour le moment fait --> ouverture du fichier log, recuperation des info utiles et incrementation d'un liste "entrée " et d'une liste "sortie". Je fait ensuit un bilan (nombre de connexions et d'octets entrant / sortant)

    Se que je souhaite maintenant faire c'est placer sur une page la liste des adresse IP qui ont des connexions avec l'exterieur (je pense ajouter un system de resolution DNS) avec pour chaque adresse un lien vers un page donnant le recapitulatif des connexions.

    Je pensais pour se faire utiliser une base SQL (se qui aurait été quand même plus simple) mais visiblement ça ne sera pas possible.


    *************
    *** EDIT ***
    *************

    Finalement je pense avoir trouvé un moyen de regler l'affaire de façon simple. Au moment ou je parcoure mon fichier de log, lorsque je recupere les données je prend l'adresse IP en cour et j'ouvre le fichier $liste_ip[-1] en creation / modification en se faisant il me cree un fichier pour chaque IP contenant les transactions effectués.

    Il me suffis ensuite simplement de faire une page en php qui liste les fichier dans le repertoire, et cree des lien avec des includes.

    Je suis conscient qu'en se faisant je ne tire pas partie de toute les possibilitées de PERL et qu'il doit forcement exister un moyen de faire ça beaucoup plus simplement mais je suis un peut pris par le temp et je vais au plus vite. En effet se script est le projet que je vais presenter à l'epreuve de BTS IG. N'etant pas en option "Developpeur d'application" j'espere que le jury comprendra que j'ai plus mis l'accent sur le reseau que sur l'ecriture du script.

Discussions similaires

  1. [langage] Table Dynamique sous PERL ?
    Par Slippers dans le forum Langage
    Réponses: 9
    Dernier message: 09/02/2005, 08h30
  2. select distinct substring
    Par nmerydem dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/06/2004, 16h58
  3. Select distinct et order by
    Par arsgunner dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2004, 11h17
  4. equivalent SELECT DISTINCT pour MyBase?
    Par chrisou31 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 19h33
  5. [VBA-E] Sélection feuilles sous excel
    Par Mystic eyes dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2004, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo