• [^] # Re: Heu

    Posté par . En réponse au message mettre les données d'un fichier dans un tableau. É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 :
    1. 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"
      
    2. 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 :).