Problème de remplissage tableau de Hachage

Résolu
bheadman Messages postés 105 Date d'inscription   Statut Membre Dernière intervention   -  
bheadman Messages postés 105 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Bon je continue avec mon pitit script en perl

J'ai, encore, un soucis.Pour commencer voici le fonctionnement du script (peut être un peu bancal car en cours de construction). J'ouvre un flux de données à partir du fichier /etc/passwd, je traite le flux. Je recherche toutes les lignes qui contiennent le mot "bin" (à dire vrai je match toutes les lignes :D) et le "range" dans un tableau.
Ensuite je prend ce tableau que je traite indice par indice. Je "split" chaque indice avec comme séparateur ":" que je range dans un tableau provisoire, redéfinis à "@tab = ()" pour chaque tour de boucle.
Pour finir, et c'est là que j'ai un problème, je remet le contenu de mon @tab provisoire dans un tableau de hachage "%hash" en prenant comme clé $tab[0] et comme valeur la concaténation du reste du tableau via la commande join(":",liste).
Au final le but est d'avoir dans mon tableau de hachage tous mes users avec comme clé le nom du user et comme valeur pour chaque clés les information sur le user.

Voici le code :

[root@srv41001 root]# cat ./test2.pl
#!/usr/bin/perl -w

# Open the dump file
open(PASSWD,"/etc/passwd") || die "Can't open /etc/passwd...$!\n";

my @listepwd = ();
# Parse out the lines
while ( <PASSWD>  )  {
 chomp;
 if ( $_ =~ /bin/) {
   push (@listepwd,$_);
 }
}
close(PASSWD);

my %hash = ();
foreach (@listepwd){
 print "$_\n";
 push(@tab,split(/:/,$_));
 $hash{$tab[0]} = (join(":",@tab[1...6])); # <<--ligne 22
}
print "\n\n\n%hash\n";


le problème est qu'il me met une erreur sur la ligne 22 et que, du coup, je crois que mon tableau de hachage ne se remplis pas, la dernière ligne me sert à visualiser le contenu de mon tableau de hash.


Merci de me dire ce qui ne va pas à la ligne 22 (ça se trouve c'est même pas comme ça qu'il faut faire :D)

voici le résultat du script :

[root@srv41001 root]# ./test2.pl
root:x:0:0:root:/root:/bin/bash
Use of uninitialized value in join or string at ./test2.pl line 22.
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
...
...
expl:x:501:501:Utilisateur exploit:/home/expl:/bin/bash
ntop:x:100:101:ntop server user:/usr/share/ntop:/bin/false



%hash
A voir également:

2 réponses

bheadman Messages postés 105 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai modifier un peu ma boucle et je constate que mon tableau de hachage se remplis bien comme souhaité ce pendant j'ai une erreur à chaque tours de boucle. Enfin par erreur je dirais plutôt une alerte dû à l'utilisation de l'option -w dans le shibang.

Voici le nouveau code :
my %hash = ();
foreach (@listepwd){
 my @tab = ();
 print "$_\n";
 push(@tab,split(/:/,$_));
 $hash{$tab[0]} = join(":",(@tab[1...7]));
 print "$hash{$tab[0]}\n";
}


et le résultat :

[root@srv41001 root]# ./test2.pl
syntax error at ./test2.pl line 21, near ")
print"
Execution of ./test2.pl aborted due to compilation errors.
[root@srv41001 root]# ./test2.pl
root:x:0:0:root:/root:/bin/bash
Use of uninitialized value in join or string at ./test2.pl line 23.
x:0:0:root:/root:/bin/bash:
bin:x:1:1:bin:/bin:/sbin/nologin
Use of uninitialized value in join or string at ./test2.pl line 23.
x:1:1:bin:/bin:/sbin/nologin:
daemon:x:2:2:daemon:/sbin:/sbin/nologin
Use of uninitialized value in join or string at ./test2.pl line 23.
x:2:2:daemon:/sbin:/sbin/nologin:
adm:x:3:4:adm:/var/adm:/sbin/nologin
Use of uninitialized value in join or string at ./test2.pl line 23.
x:3:4:adm:/var/adm:/sbin/nologin:
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Use of uninitialized value in join or string at ./test2.pl line 23.
x:4:7:lp:/var/spool/lpd:/sbin/nologin:
...
...
...
0
bheadman Messages postés 105 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

j'ai l'impression que cela n'interesse personne donc je met en résolut ce poste (de toute façon j'ai réellement trouvé la solution)

voici le code que j'ai pondu et le résultat :

#!/usr/bin/perl -w

# Open the dump file
open(PASSWD,"/etc/passwd") || die "Can't open /etc/passwd...$!\n";

my @listepwd = ();
# Parse out the lines
while ( <PASSWD>  )  {
 chomp;
 if ( $_ =~ /bin/) {
   push (@listepwd,$_);
 }
}
close(PASSWD);

my %hash = ();
foreach $U (@listepwd){
 my @tab = ();
 push(@tab,split(/:/,$U));
 $hash{$tab[0]} = join(":",(@tab[0...6]));
 print "$tab[0]\n";
 print "$hash{$tab[0]}\n";
}



[root@srv41001 root]# ./test2.pl
root
root:x:0:0:root:/root:/bin/bash
bin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync
sync:x:5:0:sync:/sbin:/bin/sync
shutdown
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
...

0