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

Langage Perl Discussion :

Recherche dans un tableau associatif


Sujet :

Langage Perl

  1. #1
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut Recherche dans un tableau associatif
    Bonjour,

    J'ai le tableau associatif suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    %BadRelay = (
               "relay1.fr" , 1 ,
               "relay2.fr" , 1 ,
               "relay3.fr" , 1
    );
    Exemple, j'ai une variable contenant respectivement : static12.smtp.relay1.fr puis static.dhcp34.relay.smtp.relay1.fr, etc....

    La variable est passée en argument à une fonction de recherche dans le tableau associatif.

    J'aimerai retrouver la valeur en rapport avec l'indice relay1.fr.

    J'ai besoin d'une solution très rapide pour compléter un filtre de détection de connexions
    sur des serveurs SMTP (lutte anti-spam) via mimedefang.

    Mon perl est un peu cafouilleux ! J'espère avoir été suffisament clair.

    Merci.

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    A ta place j'essaierais de récupérer le mot clé via une expression régulière et ensuite j'utiliserais la fonction exists. Le tout est de bien définir l'expression régulière.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/perl -w
     
    use strict;
     
     
    my %BadRelay = (
               "relay1.fr" => 1 ,
               "relay2.fr" => 1 ,
               "relay3.fr" => 1
    );
     
    my $var1 = 'static12.smtp.relay1.fr';
    my $var2 = 'static.dhcp34.relay.smtp.relay1.fr';
     
    # recherche via une expression régulière du motif clé du tableau
    # exemple : un mot suivi d'un point et de fr terminant la variable
    if ($var2 =~ m/(\w+\.fr)$/){
     
    	if (exists $BadRelay{$1}){
    		print "clé : $1\tvaleur $BadRelay{$1}\n";
    	}
    }
    Nb : pour ce qui est des tableau associatif, utiliser une flèche entre la clé et la valeur est plus courant.
    -- Jasmine --

  3. #3
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut
    Mon tableau associatif peut contenir des trucs du genre :
    (désolé pour le manque de précision de l'exemple précédent)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my %BadRelay = (
               "relay1.fr" => 1 ,
               "sd1.sd2.relay2.fr" => 1 ,
               "exemple.relay3.fr" => 1
    );
    Ton idée est intéressante mais il faut que je modifie
    l'expression régulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($var2 =~ m/(\w+\.fr)$/)

    Encore merci pour ton aide.

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Si tu ne trouves aucune expression régulière générale, tu peux en créer une à partir de tes clés mais ça devient très lourd si tu as beaucoup de clés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/perl -w
     
     
     
    use strict;
     
     
    my %BadRelay = (
               "relay1.fr" => 1 ,
               "relay2.fr" => 1 ,
               "relay3.fr" => 1
    );
     
    my $var1 = 'static12.smtp.relay3.fr';
     
    # expression régulière est la liste des clés
    my $re = join '|', keys (%BadRelay);
    $re =~ s/\./\\./g;
     
     
    # recherche via $re du motif clé du tableau
    # $re = relay3\.fr|relay1\.fr|relay2\.fr
    if ($var1 =~ m/($re)/){
     
    	if (exists $BadRelay{$1}){
    		print "clé : $1\tvaleur $BadRelay{$1}\n";
    	}
    }
    -- Jasmine --

  5. #5
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut
    Merci pour le code.

    Je viens de le mettre en place en modifiant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $re = join '|', keys (%BadRelay);
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $re = join '$|', keys (%BadRelay);
    Rien d'énorme.

    BadRelay est un tableau associatif qui est mis à jour régulièrement
    par une sonde d'analyse des logs. Il ne contient pas énormément
    d'entrée (environ 50 max) correspondantes aux attaques les plus virulentes.

    Je n'ai rien trouvé pour le moment sur la limite à partir de laquelle
    la concaténation des clefs et le test deviendraient trop lourd en terme d'exécution.

    Je recherche une solution alternative et éventuellement des infos sur
    les limites.

    A suivre, je vous tiens au courant.

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par ericduval Voir le message
    BadRelay est un tableau associatif qui est mis à jour régulièrement par une sonde d'analyse des logs. Il ne contient pas énormément
    d'entrée (environ 50 max) correspondantes aux attaques les plus virulentes.
    ... dans ce cas, l'expression régulière peut changer d'une fois à l'autre.


    Je n'ai rien trouvé pour le moment sur la limite à partir de laquelle
    la concaténation des clefs et le test deviendraient trop lourd en terme d'exécution.
    Si tu n'as pas une structure générale qui s'applique aux différentes valeurs possibles, tu n'as pas le choix.
    -- Jasmine --

Discussions similaires

  1. Recherche dans un tableau associatif à deux dimensions
    Par General_Batton dans le forum Langage
    Réponses: 4
    Dernier message: 16/10/2014, 22h47
  2. Réponses: 6
    Dernier message: 14/08/2014, 11h10
  3. Réponses: 3
    Dernier message: 06/04/2006, 16h09
  4. Clé GE dans un tableau associatif
    Par ::Fistons dans le forum Langage
    Réponses: 5
    Dernier message: 31/03/2006, 10h57
  5. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21

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