Nouvel utilisateur ou toujours le même ... [PERL] - Perl - Programmation
Marsh Posté le 12-09-2012 à 21:08:33
Code : |
C:\Perl>perl data.pl |
A+,
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.
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+,
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 +
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