Programme perl

Fermé
dragnyon - 16 déc. 2018 à 16:48
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 18 déc. 2018 à 14:38
Bonjour,
j'aurais besoin de votre aide pour mon projet en perl (vous pouvez voir le sujet et les programme que j'ai fais ici https://transfernow.net/02bfp7o17g7c ), j'ai réussi à faire le exo1.pl mais je bloque pour le exo2.pl le programme me donne page22.html, 624 alors que je devrai trouvé page22.html 201 je travail depuis des heures dessus sans trouver la solutions
merci d'avance de votre aide.

4 réponses

up
0
up!
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 18 déc. 2018 à 14:19
Salut dragnyon,

Si tu veux de meilleures chances de recevoir de l'aide rapidement, il faut faciliter la vie aux membres du forum, au lieu de renvoyer vers une archive en ligne avec près d'une 30aine de fichiers, sans explications sur ce que le code est sensé faire et avec quoi.

A l'avenir, poste un code minimal exploitable avec des données de test illustrant ton problème, au lieu de contraindre le lecteur, qui n'a peut être pas le temps, ni la motivation, d'aller à la pêche aux informations.

Alors, après avoir fait un peu d'exploration, voilà le code que tu as rédigé pour ton exo2.pl :

#! /usr/bin/perl
use strict;
use warnings;



{ my ($fich, $mot) = @ARGV;
  my $ligne;
  my $lec;
  my $nb=0;
  my $nbmot=0;

  open ($lec,"<",$fich) or die "erreur sur $fich";
   while (<$lec>)
  { $ligne=$_;
      
    
    if ($ligne=~ m/[ >]$mot[s]?[ \.\;\,\:<]/i)
     {$nb++;
      
          if($ligne=~ m/[<title<|<\/title>]/)
            {$nb=$nb+3;
            }
          if($ligne=~ m/href/)
          {$nb=$nb+2;
          }
          
         
     } 
  }
  close($lec);
  print "$fich, $nb";
}



Ton indentation n'est pas claire, mais, en l'occurrence, l'un des problèmes avec ton script exo2.pl est que tu cherches la présence des balises title et href à l'intérieur des lignes matchant la première expression. Du coup, par exemple, tu comptabilises des occurrences de lignes matchant la première expression et où il y a un lien sur une ligne mais où le mot clef ne se trouve pas à l'intérieur de la balise href.

Tu dois donc faire 2 passes (tu devrais faire 2 boucles, en mettant le contenu du fichier dans un tableau, afin d'éviter d'avoir à faire 2 lectures du fichier, ainsi tu ferais deux boucles foreach sur le tableau).

Tes expressions rationnelles sont également fausses et devraient être
m/<title>.*?$mot[s]?.*?<\/title>/i
et
m/href=".*?$mot[s]?.*?"/i
...

Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 18 déc. 2018 à 14:52
La date pour la soutenance de ton travail étant passée selon le fichier .pdf faisant partie de ta 30aine de fichiers, je ne pense pas que tu vas revenir sur le forum. Si tu reviens, tu es le bienvenue, bien sûr, et je t'invite à poser toute question sur ce que tu ne comprends pas :-)

Cela étant dit, cette discussion risque de ne pas être comprise par d'autres internautes tombant sur ce topic.

Alors, pour plus de clarté, voilà ce que donnerait un programme corrigé, commenté, supprimant les variables et syntaxes inutiles et correctement indenté :

#! /usr/bin/perl
use strict;
use warnings;

my ($fich, $mot) = @ARGV;

# on charge les lignes du fichier dans un tableau
my $lec;
open ($lec,"<",$fich) or die "erreur sur $fich";
my @lines = <$lec>;
close($lec);

# compteur de points
my $nb = 0;

# on compte le nombre d'occurrences pour cette expression
foreach (@lines) {
    if (/[ >]$mot[s]?[ \.\;\,\:<]/i) {
        $nb++;
    }
}

# chaque balise title ou href contiennant au moins une fois
# le mot recherché donne des points supplémentaires
foreach (@lines) {
    if (/<title>.*?$mot[s]?.*?<\/title>/i) {
        $nb = $nb + 3;
    }
    if (/href=".*?$mot[s]?.*?"/i) {
        $nb = $nb + 2;
    }
}

# résultat
print "$fich $nb\n";

à l'exécution :
$ ./exo2.pl page22.html cairo
page22.html 201
$
0