Perl: variable dans tableau ??

Résolu
LezardMoo Messages postés 614 Statut Membre -  
LezardMoo Messages postés 614 Statut Membre -
Bonsoir tout le monde,

je suis entrain (enfin j'essaye, je viens de tout supprimer pour tout recommencer) de faire un petit script d'analyse de log.
J'ai un problème, je n'arrive pas à mettre le contenu d'une variable dans un tableau...

Je sais que c'est simple mais je suis confronté à une situation arrachage de tiffs !!

En gros, je parse un fichier de cette forme

Jan 12 01:08:34 testmail postfix/pickup[16791]: 720D544594: uid=0 from=<root>
Jan 12 01:08:34 testmail postfix/pickup[16791]: 720D544594: uid=0 from=<clem>
...
...

je veux récupérer les noms root et clem, jusqu'ici tout va bien


open(MAIL,"<$mailog") or die("err open $mailog");
while (my $lines = <MAIL>) {
if($lines =~ m/$date/){
if ($lines =~ /([0-9]+:[0-9]+:[0-9]+)/){
&users($lines);
}
}
}

sub users{
my @userSplit = split(/</, $_[0]);
print $userSplit[1];
}

Bon, mon problème se situe ici => $userSplit[1]

un

print $userSplit[1]
donne

root>
root>
root>
root>
root>
root>
root>
clem>

C'est ca que j'aimerais mettre dans un tableau pour pouvoir compter le nombre de root ou de clem...

seulement si je passe la variable en tableau, avec un split alors j'ai bien un tableau certes seulement seule la cellule [0] contient la liste des users, alors que je cherche à récupérer un user par ligne...

Quelqu"un aurait une idée ???

Parce que la je sèche complet, j'ai pas envie de passer sous bash(meme si mon script serait deja fini et en prod depuis longtemps ^^j'ai envie d'apprendre Perl !)
Surtout que quand j'aurais la solution, le reste du script ira touuuuut seul.

Voilà merci d'avance à tout le monde ( : ( :



--
:(){ :|:& };:

4 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut LezardMoo,

    Est-ce cela que tu veux faire :

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $st = q(root>
    root>
    root>
    root>
    root>
    root>
    root>
    clem>);
    
    # capture globale des occurrences de suites de 
    # tous caractères consécutifs mais pas de >
    my @matches = ($st =~ /([^>]+)/g);
    print @matches;
    


    Dal
    0
  2. LezardMoo Messages postés 614 Statut Membre 14
     
    arf Dal je t'ai rédigé une réponse mais ne l'ai pas posté...

    Donc en fait c'est bien ce que je voudrais mais le problème c'est que ma variable $userSplit[1] n'est pas une liste.

    Si je fais par exemple

    @tab = split(/>/, $userSplit[1]);

    j'obtiens bien un split a ce niveau />/

    ce qui va me donner

    root
    root
    root
    root
    root
    root

    seulement, si je fais print $tab[0];

    je vais avoir ca qui sort

    root
    root
    root
    root
    root
    root

    donc par logique si je fais print $tab[1]

    ERREUR

    Donc ce que je voudrais c'est un moyen de récupérer cette "liste" à raison d'un root par cellule.

    $tab[0]; => root
    $tab[1]; => root
    $tab[2]; => root

    et ainsi de suite.

    Je ne sais pas si j'ai été assez clair, la tout de suite j'ai la tete dans HA/DRDB donc je suis pas à fond sur le dev, si tu as besoin de précision n'hésite pas

    Merci Dal
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      pas de pb LezardMoo

      dans ta dernière réponse, pour moi ce n'est plus clair ce que tu as dans $userSplit[1] (par rapport à ce que tu disais dans ton message d'origine).

      Comme tout découle de là, stp, peux tu faire :

      use Data::Dumper;
      print Dumper($userSplit[1]);
      exit;


      avant ton split, et me dire ce qui sort, afin d'y voir plus clair.


      Dal
      0
    2. LezardMoo Messages postés 614 Statut Membre 14
       
      Ca marche, la je viens d'avoir une tuile sur drdb, j'essaie de te sortir ça dans l'aprem
      0
  3. LezardMoo Messages postés 614 Statut Membre 14
     
    Voici le retour de

    print Dumper($userSplit[1]);
    exit;

    $VAR1 = 'root>
    ';

    Que dois je en conclure ?

    Parce que si je fait une analyse simple de la sortie je comprend que je devrait normalement pouvoir récup les autres valeurs une a une en les mettant dans un tableau, suis je sur la bonne voie ?
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Il n'y a qu'une seule ligne dans
      $userSplit[1]
      (en fait une avec \n à la fin, donc techniquement deux). Il n'y a pas les données :

      root>
      root>
      root>
      root>
      root>
      root>
      root>
      clem>

      dans
      $userSplit[1]
      comme tu le disais.

      Le reste de tes données ne serait pas dans
      $userSplit[0]
      ,
      $userSplit[2]
      ,
      $userSplit[3]
      ,... c'est à dire dans le tableau
      @userSplit
      ?

      fais :

      print Dumper(@userSplit);
      exit;



      Dal
      0
    2. LezardMoo Messages postés 614 Statut Membre 14
       
      Penses tu...

      J'ai déjà testé, en fait userSplit[0] contient

      Jan 12 01:08:34 testmail postfix/pickup[16791]: 720D544594: uid=0 from=

      Parce que j'ai splité au "<"

      Ensuite userSplit[1] vide et ainsi de suite.

      Ce qui est étonnant car si je print userSplit[1] j'ai tout les root et clem qui s'affichent...
      0
    3. LezardMoo Messages postés 614 Statut Membre 14
       
      d'un coté... je suis dans une bloucle ^^ ceci expliquerait cela alors.
      Par contre je ne sais pas comment les compter du coup
      0
    4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      ok, je vois, tu peux utiliser push pour empiler les résultats dans un tableau

      sans split ni fonction, en capturant juste ce que l'on veut avec le if, cela donne :

      my @users;
      while (my $lines = <MAIL>) {
          if ($lines =~ m/$date/){
              if ($lines =~ /^.*[0-9]+:[0-9]+:[0-9]+.*<(.*?)>/){
                  push @users, $1;
              }
          }
      }
      # faire ce que l'on veut avec @users


      https://perldoc.perl.org/functions/push


      Dal

      PS : ça va mieux ton drdb ?
      0
    5. LezardMoo Messages postés 614 Statut Membre 14
       
      ok je vais tester, il me semble que j'ai déjà essayé (mai sje vais restester) et que ca m'avait donné le même résultat, indice 0 du tableau = toute la sortie, le reste vide...

      Oui ca va mieux, en fait c'est sur deux machines un peu vieille (Debian 5 en plus de ca) matos un peu fatigué, un petit mélange de tout ca nous donne une petite saturation système...
      En réduisant la vitesse de transfert des données ca c'est arrangé un peu mais va falloir que je pousse au dessus pour un upgrade matériel...
      0
  4. LezardMoo Messages postés 614 Statut Membre 14
     
    HALLELUJAH !!!

    Merci Dal c'était ca la solution, j'ai testé avec un petit print $users[4] au pif et hop il me sort "root" c'est parfait :D

    Bon maintenant je vais pouvoir plancher sur la suite (j'ai commencé une nouvelle version from scratch, je vais pouvoir reprendre la première)

    0