Ç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ドル);
}
Si tu ne connais pas les regexp un bouquin/tutiriel te sera surement utile.Si on reprends tout notre exemple avec l'utilisation des regexp, on aurait pu aussi réduire la taille du code en utilisant 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 à 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 pifou . En réponse au message mettre les données d'un fichier dans un tableau. Évalué à 4.
#!/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):
- 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 tu ne connais pas les regexp un bouquin/tutiriel te sera surement utile.Si on reprends tout notre exemple avec l'utilisation des regexp, on aurait pu aussi réduire la taille du code en utilisant la variable magique ($_) :my @datas=split(":", $line); print $datas[0]."\n"# 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 :).