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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    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 confirmé
    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
    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 expérimenté
    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
    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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    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
    Expert confirmé
    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
    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ï

  6. #6
    Membre expérimenté
    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
    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

  7. #7
    Membre expérimenté
    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
    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

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