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 :

comment générer des tableaux en perl


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut comment générer des tableaux en perl
    Bonjour,

    Je fais des scripts en perl actuellement et j'ai, jusqu'à présent, toujours trouvé des réponses à mes problèmes sur le web. Mais là, je ne sais vraiment pas comment faire.

    Voici le problème : je récupère une liste de nom de société dans un fichier que je place dans un tableau puis je récupère le nombre de société avec le nombre d'élément du tableau. Pour chaque société, je crée un tableau à 2 dimensions pour y stocker plusieurs informations (rapport d'incident : adresse ip, site ou à eu lieu l'attaque...) que je n'arrive pas à automatiser. Enfin, je crée une table de hachage de tableau avec pour clés, le nom des sociétés et pour valeurs, les tableaux de données associés.

    Le problème est de réussir à générer plusieurs tableaux à partir d'une variable. Imaginons que j'ai dans mon fichier 13 sociétés, il faut que je crée 13 tableaux différents. Est-il possible de réaliser cela au sein d'une boucle for en perl ?

    # récupération des noms de société dans le fichier (plusieurs information sur la ligne du fichier). Il y a, en général, plusieurs fois le même nom de société
    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
    my @liste;
    my $l = 0;
    my $before = "";
    while (defined($ligne = <FICHIER> ))
    {
     my @tmp = split (/;/,$ligne);
     if ($before ne $tmp[3])
     {
     $liste[$l] = $tmp[3];  
     $before = $liste[$l];
     $l++;
     }
    }
     
    my $element = @liste;

    Suite à ça, j'aimerai pouvoir créer un nombre de tableau équivalent à $element. Quelqu'un aurait-il une idée ?

    Merci d'avance.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Tu peux créer des tableaux anonymes (Références vers un tableau) que tu stocke ou alimente dans ton hash au fur et à mesure de la lecture de ton fichier.

    Jettes un coup d'oeil dans la FAQ sur la partie référence.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ok merci. Je suis allée voir et j'ai fait autrement. Mais je coince de nouveau.

    Pour chaque nom de société, je parcours le fichier afin de créer un tableau d'information correspondant au nom de la société. Une fois le tableau créé, je l'envoie dans le hash puis réinitialise le tableau afin d'y insérer les valeurs de la société suivante que j'enverrai ensuite dans le hash.

    Bien évidemment, dans le code ci-dessous, la table hash fait une référence sur le tableau nommé "@tab" et comme je le réintialise, ma table hash est vide !

    Comment pourrai-je m'y prendre pour ne pas perdre le tableau envoyé dans le hash tout en réinitialisant mon tableau afin qu'il puisse recevoir les informations suivantes ? Les références sur tableau peuvent-elles m'aider ici ? Si oui, comment faire ?

    ...
    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
    29
    30
    31
    32
    my $element = @liste;
    print "Element = $element\n";
     
    for ($l=0;$l<=$element;$l++)
    {
    while (defined($ligne = <FICHIER>))
    {
    	@test= split (/;/,$ligne);
    	my $nb_elt = @test;
     
    	if ( $test[3] eq $liste[$l])
    	{
    	$tab[$i][$nb_elt+1]=$nb_elt;
    	for ($j=0;$j<=$nb_elt;$j++){
    		$tab[$i][$j] = $test[$j];
    	}
    	$i++;
    	}
     
    }
    my $atab;
     
    for $atab ( @tab ) {
         	print "\n[ @$atab ],\n";
     	}
     
    %h = (
    	"$liste[$l]" => [@tab]
         );
     
    @tab = ();
    }

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Et je me dis aussi que dans ma boucle for, je parcours le fichier mais je ne retourne pas en début de fichier à la fin du while. Est ce que ca se fait automatiquement ?

    Il m'affiche le résultat du premier tableau uniquement. Je ne sais pas exactement d'ou vient le pb... Car même si j'écrase mon tableau @tab, je le remplis de nouveau normalement...

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, j'ai dû mal à comprendre ce que tu veux faire.
    Peux tu nous fournir un exemple de fichier et de résultat souhaité.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'ai un fichier qui possède sur chaque ligne des informations spécifiques à une société (adresse ip, nom societe, AS number, ...). Le nom de société se trouve à la 3ème place dans mon fichier. C'est regroupé par société, par exemple, les trois premières lignes auront le même nom de société, la deuxième société aura les 5 prochaines lignes etc... Je récupère ce nom sur chaque ligne et je le veux qu'une seule fois. Par contre, je veux associer au nom de société les lignes du fichier correspondantes.

    ex de ligne du fichier :
    X.X.X.X;Belgium;ASXX;Société;http://www.siteinternet.com
    X.X.X.X;Belgium;ASXX;Société;http://www.siteinternet.com
    X.X.X.X;France;ASXX;Société;http://www.siteinternet.com
    ...

    Au final, il me faut un hash ayant pour clé chaque nom de société associé à un tableau à 2 dimensions correspondant aux informations de la société.

    J'espère avoir été plus clair...

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Si je prends pour exemple ce fichier
    1.2.3.4;Belgium;ASXX;Société;http://www.siteinternet.com
    5.6.7.8;Belgium;ASXX;Société;http://www.toto.com
    9.0.1.2;France;ASXX;Société;http://www.titi.com
    a.b.c.d;France;SOC2;Société;http://www.poste.com
    Tu voudrais obtenir un hash ressemblant à ceci par exemple.
    Clé = nom socièté et valeur = référence de tableau contenant plusieurs tableau anonyme (correspondant chacun à une ligne).

    ASXX => [
    ['1.2.3.4','Belgium','http://www.siteinternet.com'],
    ['5.6.7.8','Belgium','http://www.toto.com'],
    ['9.0.1.2','France','http://www.titi.com'],
    ]
    SOC2 => [
    ['a.b.c.d','France','http://www.poste.com'],
    ]
    C'est bien ça ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui c'est ca.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Mais j'ai une solution :

    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
    open(FICHIER, "$nom.Geo") || die "Impossible d'ouvrir le fichier $nom :$!";
     
    while (defined($ligne = <FICHIER> )) {
     
    chomp $ligne;
     
    my @tmp = split (/;/, $ligne);
     
    if (!defined($h{$tmp[3]})) 
       {
     
        $h{$tmp[3]} = [];
     
       }
     
       push @{$h{$tmp[3]}}, [@tmp];
     
    }
     
    close (FICHIER);
    Ca a l'air de fonctionner comme ca

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voilà en plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my $fichier =  "$nom.Geo";
    open(FICHIER, '<', $fichier) || die "Impossible d'ouvrir le fichier $fichier :$!\n";
    while ( my $ligne = <FICHIER> ) {
      chomp $ligne;
      my ($ip, $pays, $nom, $societe, $site) = split (/;/, $ligne);
      if ( exists $h{$societe} and ref( $h{$societe}) eq 'ARRAY' ) {
        push @{ $h{$societe} }, [$ip, $pays, $nom, $societe, $site];
      } 
      else {
        $h{$societe} = [];
      } 
    }    
    close (FICHIER);

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/06/2007, 19h48
  2. Réponses: 9
    Dernier message: 14/12/2005, 19h44
  3. Comment déplacer des fichiers sous perl ?
    Par Ickou dans le forum Langage
    Réponses: 6
    Dernier message: 10/11/2005, 13h17
  4. Réponses: 2
    Dernier message: 22/07/2005, 23h19
  5. Comment générer des pages HTML dynamiques ?
    Par Devil666 dans le forum Java EE
    Réponses: 2
    Dernier message: 15/04/2005, 11h56

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