[Perl] Extraction de texte d'une fichier

BB31 Messages postés 1 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Salut,

j'aimerai extraire des paramètres d'une fonction précise dans plusieurs fichiers appelant cette fonction.
Le parcours des fichiers, la recherche du mot clé est déjà codé.
Par contre, je n'ai aucune idée de comment est-ce qu'on va extraire des bouts de ligne.

Ma boucle :
# Run function search through each file
foreach $file (@files)
{
# Parse C file to find suRegisterPortName
print "\n\t$file";

open (SRC_FILE, "$file") or warn "E/S : $!\n";
while(<SRC_FILE>)
{
if (/suRegisterPortName/)
{
?? TO DO
}
}
close(SRC_FILE);
}

Sachant que ma function, selon les fichiers C, peut etre écrit des manières suivantes :

suRegisterPortName(toto, tata, titi);
suRegisterPortName(toto,
tata,
titi);
suRegisterPortName(toto, tata);

Et j'aimerai isoler toto et tata dans un fichier d'output pour avoir:
toto tata
toto' tata'
...

En attendant vos aides, je vais tenter ma chance :)

Merci
Benoit
Configuration: Windows XP
Firefox 2.0.0.4

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    inspire toi
    #!/usr/bin/perl
    use strict;use warnings;
    
    sub suRegisterPortName{
            return "(${\(join '|',@_)})";
    }
    
    my $var = suRegisterPortName("toto","tata");
    while(<DATA>){
            print "$1: $_" if /$var/;
    }
    __END__
    tata - element
    toto - element
    titi - neant
    
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    ou même
    #!/usr/bin/perl
    use strict;use warnings;
    
    sub suRegisterPortName{
            return "(${\(join '|',@_)})";
    }
    
    while(<DATA>){
            print "$1: $_" if /${\(suRegisterPortName("toto","tata"))}/;
    }
    __END__
    tata - element
    toto - element
    titi - neant
    mais j'avoue que je n'ai pas vraiment compris ce que tu veux ;-)
    0
  3. BB31
     
    Hello,

    en fait, je parse des fichiers C.
    Dans ce fichiers C, je cherche l'utilisation de la fonction suRegisterPortName.
    Donc des que je repere un fichier C qui contient une fonction qui utilise la fonction suRegisterportName,
    je veux choper les parametres qui sont passés à cette fonction (tata, toto).
    Donc il faut que je recupere et que je stocke tata et toto.
    La difficulté pour moi est qu'il faut que je gère le fait que cette fonction est jamais appellée de la meme manière.
    Y a des gens qui codent comme ça :
    suRegister (toto, tata);
    ou comme ça:
    suRegister(toto,
    tata);
    ou comme ça:
    suRegiste(
    toto,
    tata);
    et cette fonction peut meme prendre un troisieme paramètres, mais je veux l'ignorer :
    suRegister(toto, tata, titi);

    Et j'avoue que je sais pas comment gerer ça.

    Benoit
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    je ne comprends toujours pas
    la fonction suRegisterportName se trouve où? Dans tes fichiers C ou dans le script Perl

    C'est simple, si tu veux parser alors il faut connaître les fichiers sources, et le résultat en sortie.
    Voilà de ce que j'ai besoin pour t'aider.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. BB31
     
    Désolé, je vais essayer de clarifier :)

    Le script perl : il va parcourir tous les fichiers C d'un repertoire. Il va ouvrir chaque fichier C et chercher si suRegisterPortname est utilisé dans ce fichier C. Si oui, le script Perl va récuperer les 2 premiers paramètres passés à la fonction suRegisterPortname.
    Les script perl va stocker ces 2 paramètres dans un fichier txt en output.
    Donc au final , je vais générer un fichier txt qui contiendra tous les couples de paramètres utilisés lors d'un appel de la fonction suRegister.

    Ensuite, faudra que je généère un fichier XML, mais ça, c'est de la mise en forme, je devrai m'en sortir sans souci.

    j'ai été plus clair ?

    benoit
    0
  7. Bouben
     
    Bonjour,
    plus personne pour m'aider ?

    Merci :)
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    root@debian:~/trash# ls -1 *.c
    fic1.c
    fic2.c
    fic3.c
    fic4.c
    root@debian:~/trash# cat fic1.c
    suRegisterPortName(toto, tata, titi);
    root@debian:~/trash# cat fic2.c
    suRegisterPortName(toto,
    tata,
    titi);
    
    root@debian:~/trash# cat fic3.c
    suRegisterPortName(toto, tata);
    root@debian:~/trash# cat fic4.c
    suRegisterAutreChose(toto, tata, titi);
    root@debian:~/trash# cat ccm.pl
    #!/usr/bin/perl
    use strict;use warnings;
    my $param;
    my $f;
    while ($f = <*.c>){
      open FIC,$f
        or warn "E/S : $!\n";
      while(<FIC>){
        if (/suRegisterPortName/ .. /;/){
          s/\n//;
          $param .= $_ ;
        }
      }
      close(FIC);
    }
    my @t = split /;/,$param;
    for (@t){print "$1 $2\n" if /\((\w+)\s*,\s*(\w+)/}
    __END__
    root@debian:~/trash# perl ccm.pl
    toto tata
    toto tata
    toto tata
    root@debian:~/trash#
    
    0