Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1704 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2156504
grulles
Posté le 12-09-2012 à 17:43:51  profilanswer
 

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
mood
Publicité
Posté le 12-09-2012 à 17:43:51  profilanswer
 

n°2156536
gilou
Modérateur
Modzilla
Posté le 12-09-2012 à 21:08:33  profilanswer
 

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é!  --
n°2156621
grulles
Posté le 13-09-2012 à 14:06:22  profilanswer
 

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.  

n°2156627
gilou
Modérateur
Modzilla
Posté le 13-09-2012 à 14:31:04  profilanswer
 

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é!  --
n°2156655
grulles
Posté le 13-09-2012 à 16:13:40  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

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

 

Sujets relatifs
(VBS )Eviter doublon - création utilisateur ad[PERL] Mixer un tableau
[Drupal] Personnalisation profile utilisateurPERL SQLPLUS encapsulé
[PERL] Lire un paragraphe[resolu]Problème : récuperation de données d'un utilisateur facebook
CGI perlWin32 invalide en executant 1 script perl via Eclipse
Transformer en numéro de colonne une saisie utilisateurRequête selon date de chaque enregistrement
Plus de sujets relatifs à : [PERL] Nouvel utilisateur ou toujours le même ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR