Aide Linux - Liste de diffusion Ze-Linux hebergée par Hebergement - Over-Link
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [programmation] aide sur script perl.



Breton, Dany (Dany) a écrit :
Salut la liste, j'ai un petit soucis avec un script perl et je ne décele pas
mon erreure.
Voici mon script :

#!/usr/bin/perl -w
use strict;

my @liste=('revision','Platform');
my $element;
my $sum;
my $cherche;
foreach $element (@liste) {
print  ("$element\n");
                        $cherche=$element;
                        $sum="0";
                                while(<>){
                                        $sum += (s/\b$cherche\b/$cherche/g);
                                        };
print("Votre fichier contient $sum fois le mot \'$cherche\'\n");
                                        };

Le probleme est le suivant : si je met 1 seul element dans la liste pas de
soucis j'ai en fonction de mon fichier de traitement le nombre d'occurences
de l'element. Par contre si j'en met 2 et bien le script boucle sans fin
sans me donner les résultats.

Merci pour votre aide Dany
Le problème vient du fait que tu lis l'entrée standard à chaque itération de la boucle : la première fois, ça marche normalement, on lit le fichier que passes en paramètre (par exemple), mais la deuxième fois, tu ne peux pas relire la même entrée standard, donc ton script attend de nouvelles données sur l'entrée. D'ailleurs, si tu saisis directement ctrl+d pendant qu'il s'exécute, tu verras que tu auras un message qui t'indique que ton fichier contient x fois le mot 'Platform'.

La solution que je vois (mais je ne suis pas un gourou de perl et je pense qu'il y a une façon plus élégante de le faire) serait d'inverser les boucles : au lieu de lire les fichiers pour chaque mot-clé, tu recherche chaque mot-clé dans chaque ligne du fichier (ça paraît d'ailleurs plus efficace en termes de performance si les fichiers que tu as à analyser sont susceptibles d'être volumineux).

Quelque chose comme ça devrait marcher :

#!/usr/bin/perl -w
use strict;

my @liste=('revision','Platform');
my $element;
my %sum;
my $cherche;


while (<>) {
foreach $element (@liste) {
$sum{$element} += (s/\b$element\b/$element/g);
} }
foreach $element (@liste) {
print "Votre fichier comporte $sum{$element} fois le mot $element\n";
}
----------------------------------
Informations, désabonnement, règles, obligations sur la liste Aide-Linux :
http://lists.ze-linux.org/howto_ml.html
Liste Herbergee par Over-Link [http://www.over-link.net]


Aide Linux - Liste de diffusion Ze-Linux hebergée par Hebergement - Over-Link