[PERL] Nouvel utilisateur ou toujours le même ...

Nouvel utilisateur ou toujours le même ... [PERL] - Perl - Programmation

Marsh Posté le 12-09-2012 à 17:43:51    

Bonjour amis developpeurs ...  
 
J'ai un tableau qui contient ces données.  
NOM UTILISATEUR:0c
COMMENTAIRE:Lumumba Paul-henry
CODE LANGUE:01
APP?:DISTRICAT HAREN
CMD?:/opt/LV/DIS/bibsh/DIS_accueil.sh -u HAR1
NOM UTILISATEUR:0s
COMMENTAIRE:GIORDANINO Jean-Claude
CODE LANGUE:01
APP?:DISTRICAT NOGENT SUR OISE
CMD?:/opt/LV/DIS/bibsh/DIS_accueil.sh -u NGT1
APP?:DISTRICAT ROGNAC
CMD?:/opt/LV/DIS/bibsh/DIS_accueil.sh -u RGN1
APP?:DISTRICAT GENNEVILLIERS
CMD?:/opt/LV/DIS/bibsh/DIS_accueil.sh -u GEN1
APP?:DISTRICAT QUINCIEUX
CMD?:/opt/LV/DIS/bibsh/DIS_accueil.sh -u QUI1
...
le but est de parcourir le tableau en "splittant" par ":" (joli terme franglais), récupérer la deuxième valeur et  stocker le tout dans une seule ligne,  mais à chaque fois qu'il rencontre la chaine "NOM UTILISATEUR" il doit changer de ligne.  
Voici le bout de code qui split  
 
foreach my $value (@reftemp) {
         
        @temp = split (/:/,$value);
               if (defined ($temp[1])) {
        #print $temp[1];
        push @ref,$temp[1];
     }
 
voici le résultat escompté  
0c:Lumumba Paul-henry:01:DISTRICAT HAREN:/opt/LV/DIS/bibsh/DIS_accueil.sh -u HAR1
0s:GIORDANINO Jean-Claude:01:DISTRICAT NOGENT SUR OISE:/opt/LV/DIS/bibsh/DIS_accueil.sh -u NGT1:DISTRICAT ROGNAC:/opt/LV/DIS/bibsh/DIS_accueil.sh -u RGN1:......
etc etc ...  
 
J'espère avoir été clair ...  
Merci  de votre aide


Message édité par gilou le 12-09-2012 à 20:43:19
Reply

Marsh Posté le 12-09-2012 à 17:43:51   

Reply

Marsh Posté le 12-09-2012 à 21:08:33    

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $file = "data.txt"; # Je l'ai nommé ainsi pour tester
  6. my $first = 1;
  7. my @fields;
  8. open(my $fh, $file) or die "can't openfile $file: $!";
  9. while (<$fh> ) {
  10.  chomp;
  11.  @fields = split /:/;
  12.  map {s/\s*$//} @fields;
  13.  if (/NOM UTILISATEUR/) {
  14.    print "\n" unless $first;
  15.    $first = 0;
  16.  }
  17.  else {
  18.    print ":";
  19.  }
  20.  print $fields[1];
  21. }
  22. print "\n";
  23. close $fh;


C:\Perl>perl data.pl
0c:Lumumba Paul-henry:01:DISTRICAT HAREN:/opt/LV/DIS/bibsh/DIS_accueil.sh -u HAR1
0s:GIORDANINO Jean-Claude:01:DISTRICAT NOGENT SUR OISE:/opt/LV/DIS/bibsh/DIS_accueil.sh -u NGT1:DISTRICAT ROGNAC:/opt/LV/DIS/bibsh/DIS_accueil.sh -u RGN1:DISTRICAT GENNEVILLIERS:/opt/LV/DIS/bibsh/DIS_accueil.sh -u GEN1:DISTRICAT QUINCIEUX:/opt/LV/DIS/bibsh/DIS_accueil.sh -u QUI1


A+,


Message édité par gilou le 12-09-2012 à 21:14:54

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-09-2012 à 14:06:22    

Salut Gilou,
Déjà un grand merci pour ta réponse. Je viens de faire un petit test. Mais cela ne semble pas fonctionner comme prévue.  
Dans ton exemple ta boucle utilise un "scalair" sur un fichier, dans mon cas j'utilise un tableau ..
while (@reftemp ) {
...
}
J'obtiens cette erreur  
Use of uninitialized value $_ in scalar chomp at ref_user.pl line 94,<INFILE> line 210.
Effectivement plus haut <INFILE> est le handler que j'utilise pour lire un fichier contenant tous les utilisateurs avec toutes les infos. En voici le code  
...
# All pattern
my $user = "NOM UTILISATEUR";
my $comment = "COMMENTAIRE";
my $language = "CODE LANGUE" ;
my $printerA = "IMPRIMANTE A";
my $printerC = "IMPRIMANTE C";
my $app = "APP";
my $cmd = "CMD";  
...  
my $src_name=$_[0];
 open(INFILE,"<",$src_name) or  
    die("Unable to open input file $src_name" );
     
 while ( <INFILE> ) {
    # suppress 2 or more space caracters by void and split each elements with ":" into an array  
    s/\s{2,}//g;
    # print $_;
    if ( m/$user/ || m/$comment/ || m/$language/ || m/($printerA).\w/ || m/($printerC).\w/ || m/^($app)..\w/  || m/^($cmd)...\w/ ) {
               push (@reftemp,$_);
               print $_;
    }    
 }
Le résultat de cette boucle est dans le premier poste ...  
Donc pour en revenir au test que j'ai effectué, j'ai remplacé la boucle while par un foreach mais le résultat attendu n'est pas concluant.  

Reply

Marsh Posté le 13-09-2012 à 14:31:04    

Tu fais un  
foreach my $value (@reftemp) {
 
}
 
d'ou ton erreur, car alors, c'est sur $value que doit porter le chomp (il est peut être inutile à cet endroit, il est la pour virer les \n en fin de ligne et devrait se trouver la ou tu lis le fichier).
donc il faudrait faire chomp $value; et pareil pour le reste.
 
Si on fait un  
foreach  (@reftemp) {
 
}
c'est implicitement équivalent à
foreach my $_ (@reftemp) {
 
}
pareil, un chomp; signifie en fait chomp $_;
idem pour le split, split /:/; signifie implicitement split /:/, $_;
Pour le map, c'est plus rusé.
s/\s*$//; ça applique le transformation à $_
et ce que fait le map, c'est d'assigner (récursivement) l'élément courant du tableau à $_ (et non pas une copie de valeur), puis appliquer le bloc: donc le bloc étant {s/\s*$//}, on applique s/\s*$// à $_, donc (successivement) à chaque élément du tableau.
 
Bon, tu as toutes les billes.
A+,


Message édité par gilou le 13-09-2012 à 14:31:18

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-09-2012 à 16:13:40    

Merci Gilou,
C'est tout bon, ca fonctionne correctement. J'avais fait une petite erreur. lors du split et du map, j'utilisais le mauvais tableau.
A +


Message édité par grulles le 13-09-2012 à 16:13:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed