[Perl] Extraction de texte d'une fichier

Fermé
BB31 Messages postés 1 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 24 septembre 2007 - 24 sept. 2007 à 15:21
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 1 oct. 2007 à 12:39
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 sept. 2007 à 16:13
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 sept. 2007 à 16:17
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
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 sept. 2007 à 16:59
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
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
Bonjour,
plus personne pour m'aider ?

Merci :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 oct. 2007 à 12:39
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