[Perl] Extraction de texte d'une fichier

BB31 Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21331 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
A voir également:

7 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
Bouben
 
Bonjour,
plus personne pour m'aider ?

Merci :)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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