Retourner aux forums || Retourner au forum Programmation.perl
Programmation.perl : mettre les données d'un fichier dans un tableau
Posté par modr123 () le 02 mai 2005et 0 si A n'est pas présent
comme j'ai vu le précédent message sur le sujet j 'ai essayé d'adapter a mon cas ,mais ça ne marche pas
je débute sous perl et malgré la doc que j'ai lu cet aprés-midi je n'avance pas d'un pouce
deuxième question comment on lit le tableau
pour protester contre la dadvsi , je n'achete plus de produit soumis au droit d'auteur ou voisins
Qui a chanté "comme un ouragan" ?
Vous pouvez répéter la questioooooooooooon ?
Non sincèrement, je n'ai rien compris.
Heu
Bon alors vu la qualité de ta question, ne t'attends pas à une réponse géniale. Si tu dois juste stocker dans un tableau le contenu d'un fichier (le tableau contient une cellule par ligne du fichier) le plus simple :
$file="/etc/passwd"; # Ouverture du fichier open(FD, $file) or die "$file : $!"; # Copie du contenu du fichier dans un tableau @lines=<FD>; # Fermeture du fichier close(FD);Ensuite pour parcourir le tableau :
# Afficher la taille du tableau
print scalar(@lines)."\n";
#parcours linéaire des lignes du tableau
foreach $line (@lines) {
# Enlever le retour chariot de fin de ligne
chomp($line=$line);
# On coupe la ligne en utilisant comme séparateur ':'
# équivalent à : @result=split(":", $line);print @result[0]."\n";
($user, $passwd, $uid, $gid, $desc, $home, $shell) = split(":", $line);
print $user."\n";
}
Je te conseille tout de même d'acheter un bouquin sur Perl (par exemple de chez O'Reilly http://www.oreilly.fr/perl.html(...) ) pour commencer et/ou de trouver un tutoriel sur Internet. Si tu bloques déjà sur des choses comme ça tu n'as pas fini de ne pas avancer d'un pouce :).
-
[+] [^]Re: Heu
Posté par modr123 () le 02/05/2005 à 23:04. (lien). Évalué à -1.je n'était pas clair , mais ce l'était pour moi
j'ai un fichier qui contient des données , pas un tableau
je souhaite mettre ses données dans un tableau
my @tableau = ();
open my $fh, "< /home/guy/lalalalala.txt" or die $@;
while (<$fh>)
if(/^(Cr[^,]*),$/) c'est ce truc que je comprends pas , je veux recuperer ce qu'il a apres Cr--
pour protester contre la dadvsi , je n'achete plus de produit soumis au droit d'auteur ou voisins-
[^]Re: Heu
Posté par Olivier Macchioni () le 03/05/2005 à 01:08. (lien). Évalué à 2.Envoyer un extrait du fichier serait probablement pertinent.
-
[^]Re: Heu
Posté par pifou () le 03/05/2005 à 08:37. (lien). Évalué à 4.Ça serait plus simple si tu nous donnais un exemple de fichier de données, mais comme j'ai un peu de temps (j'ai fini mon script de contrôle de Freevo par gamepad usb plus rapidement que prévu ... merci ruby-sdl) je vais essayer de te donner un maximum d'information pour résoudre ton problème. Alors reprennons depuis le début et en évitant dans un premier temps d'utiliser la variable magique :
#!/usr/bin/perl # Faisons les choses bien, on va se forcer à bien déclarer nos variables use strict; # Initialisation du tableau my @array=(); # Fichier exemple my $file="/etc/passwd"; # Ouverture du fichier, stockage du descripteur dans la variable $fd open(my $fd, $file) or die "$file : $!"; # Parcour linéaire du fichier à l'aide du descripteur foreach my $line(<$fd>) { # Maintenant on a la ligne courante dans $line # On enleve le retour chariot de fin de ligne chomp($line); print $line."\n"; # Suivra le traitement pour récupérer les informations pertinentes à stocker dans le tableau #[[TRAITEMENT]] } # Fermeture du fichier close($fd)Il nous reste à faire le traitement des lignes de ton fichier, tu as souvent 2 cas qui se présentent :- Les données à récupérer sont séparées par des délimiteurs fixes (comme dans /etc/passwd le ':'), dans ce cas c'est assez facile de récupérer les données en utilisant la fonction split (qui renvoie un tableau):
my @datas=split(":", $line); print $datas[0]."\n" - Les données sont assez exotiques, il faut alors souvent passer par les regexp (expressions rationelles/régulières). Dans le cas que tu cites, ça correspond bien au if(/.../). Prennons l'exemple (stupide) de /etc/password où l'on veut stocker dans @array les identifiants des utilisateurs utilisant bash :
# Si la ligne commence par tout sauf un ':' plusieurs fois (stockage dans $1) # puis suivit de n'importe quoi (.*) et finissant ($) par bash if($line=~/^([^:]+).*bash$/) { # On ajoute l'utilisateur en question ($1) dans le tableau @array push(@array, $1); }
#!/usr/bin/perl # Faisons les choses bien, on va se forcer à bien déclarer nos variables use strict; # Initialisation du tableau my @array=(); # Fichier exemple à stocker dans le tableau my $file="/etc/passwd"; # Ouverture du fichier, stockage du descripteur dans la variable $fd open(my $fd, $file) or die "$file : $!"; # Parcour linéaire du fichier à l'aide du descripteur while (<$fd>) { # Maintenant on a la ligne courante dans $_ (variable magique) # On enleve le retour chariot de fin de ligne chomp; # Si la ligne ($_) commence par tout sauf un ':' plusieurs fois (stockage dans $1) # puis suivit de n'importe quoi (.*) et finissant ($) par bash if (/^([^:]+).*bash$/) { # On ajoute l'utilisateur en question ($1) dans le tableau @array push(@array, $1); } } # Affichage des utilisateurs de bash : print "Utilisateurs de bash : ".join(", ", @array)."\n"; # Fermeture du fichier close($fd)Avec ça tu devrais pouvoir avancer un petit peu, enfin je l'espère :).-
[^]Re: Heu
Posté par Clément varaldi (page perso, ) le 03/05/2005 à 12:27. (lien). Évalué à 2.Si je puis me permettre de patcher ton code, je rajouterai un petit truc :
< open(my $fd, $file) or die "$file : $!";
> open(my $fd, "< $file") or die "$file : $!";
< chomp;
> chomp;
> #une ligne de /etc/passwd ressemble à :
> # titi:x:65534:65534:toto:/home/titi:/bin/sh
> # on va essayer de récupérer 'titi' mais uniquement si titi utilise bash comme shell...
- Les données à récupérer sont séparées par des délimiteurs fixes (comme dans /etc/passwd le ':'), dans ce cas c'est assez facile de récupérer les données en utilisant la fonction split (qui renvoie un tableau):
-
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.perl



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.