Forum Programmation.perl mettre les données d'un fichier dans un tableau

Posté par  .
Étiquettes : aucune
0
2
mai
2005
j'ai fichier du genre A nombre et je souhaite mettre les données dans un tableau
et 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
  • # Qui a chanté "comme un ouragan" ?

    Posté par  . Évalué à 3.

    Vous pouvez répéter la questioooooooooooon ?

    Non sincèrement, je n'ai rien compris.
  • # Heu

    Posté par  . Évalué à 3.

    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  . É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
      • [^] # Re: Heu

        Posté par  . Évalué à 2.

        Envoyer un extrait du fichier serait probablement pertinent.
      • [^] # Re: Heu

        Posté par  . É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 :).
        • [^] # Re: Heu

          Posté par  . É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...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.