IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Comment faire plus simple


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut Comment faire plus simple
    Bonjour j'ai un petit bout de code destiné a extraire des liens d'une page web mon code fonctionne mais je voudrais qu'il soit,plus simple car le foreach() prend quand même du temps , j'ai essayer de faire moi meme mais je n'y suis pas arrivé



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sub extraire_liens  {
     my (@liens, $lesliens);
     $code = shift;
     $url  = shift;
     my $parseur = HTML::LinkExtor->new(sub {
                                   my($tag, %attr) = @_;
                                   return if $tag ne 'a';
                                   push(@liens, values %attr);
                                 });
       $parseur->parse($code);
       foreach my $uri ( map { $_ = url($_, $url)->abs; } @liens ) {
          $lesliens->{$uri} = 1;
       }
     return $lesliens;
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    pour gagner un peu de vitesse tu peux instancier ton objet linkextor en dehors de ta sub, en le mettant en cache dans ton objet si tu fait du OO ou en le gardant en statique dans ta sub (grace à un bloque autour de ta sub, qui localise les variables) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
      my $parseur;
      my @liens;
      sub extraire_liens  {
        my ($lesliens);
        my $parseur||= HTML::LinkExtor->new(...
        @liens = ();
       ...
      }
    }
    avec le || $parseur ne sera créer que si il n'existe pas deja.
    en plus tu evite la closure (la sub anonyme dans el new) qui est assez lente lors de sa creation. En contrepartie puisque tu utilise @liens dans ta closure tu dois la sortir aussi en statique, et la vider à chaque fois.

    Autre chose, pour ton foreach et map, tu peux eviter le map et faire l'absolutisation d'url dans le foreach:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $extracted (@liens) {
      $lesliens->{ url($extracted, $url)->abs } = 1;
    }
    ensuite ce qui reste lent c'est sans doute l'absolutisation d'url: le modeul URI est tres bien mais c'est une sacrée limace...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Merci pospos , connais tu un module plus rapide qu' URI ?

    Autre question ou je met ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my($tag, %attr) = @_;
    return if $tag ne 'a';
    push(@web, values %attr);

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Sa marche


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
      my $parseur;
      my @liens;
      sub links : locked method {
        my ($lesliens);
        my $parseur||= HTML::LinkExtor->new(sub {
                                             my($tag, %attr) = @_;
                                             return if $tag ne 'a';
                                             push(@liens, values %attr);
                                           });
           $parseur->utf8_mode;
           $parseur->parse($code);
        for my $extracted (@liens) {
          $lesliens->{ url($extracted, $url)->abs } = 1;
        }
        @liens = ();
        return $lesliens;
      }
    }
    merci encore pospos

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    J'ajouterais que je ne vois pas l'intérêt du tableau @liens ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    {
      my $url;
      my $lesliens;
      my $parseur = HTML::LinkExtor->new(sub {
                                             my($tag, %attr) = @_;
                                             return if $tag ne 'a';
                                             $lesliens->{ url($attr{href}, $url)->abs } = 1
                                           });
     
      $parseur->utf8_mode;
      sub links : locked method {
          $lesliens = {};
          my $code = shift;
          $url = shift;
          $parseur->parse($code);
          return $lesliens;
      }
    }
    --
    Jedaï

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    exacte, autant tout faire dans la sub

    j'ai fait une boulette dans mon example:
    il faut faire
    $parser ||=
    et non
    my $parser ||=

    sinon le fait que la variable soit statique ne sert à rien.

    Ensuite tu peux faire comme jedai decrit, et faire le new directement en degors de ta sub, mais dans ce cas pense a mettre le bloc qui entour ta sub en BEGIN, car sinon il risque ne ne pas avoir été initialisé au moment ou tu appel ta sub (si par exemple tout cela est dans un script et non un module)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN {
      my $parser = ...
      sub links {
      }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire plus simple ?
    Par the_lord_sith dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 04/04/2013, 09h20
  2. [Débutant] Dictionary global : comment faire plus simple ?
    Par TheYggdrazil dans le forum VB.NET
    Réponses: 5
    Dernier message: 26/03/2012, 15h37
  3. Procédure stockée : comment faire plus simple / plus fiable ?
    Par allaume dans le forum Accès aux données
    Réponses: 1
    Dernier message: 08/08/2007, 12h17
  4. [C#] Impression GDI+, OK mais comment faire plus simple ?
    Par yo2105 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/12/2006, 20h29
  5. Comment faire plus simple
    Par mobscene dans le forum Langage
    Réponses: 5
    Dernier message: 26/07/2005, 04h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo